PHP
2024-05-05 09:53:19 1 举报
AI智能生成
PHP(PHP: Hypertext Preprocessor,超文本预处理器)是一种广泛使用的开源服务器端脚本语言,主要用于开发动态网站和Web应用程序。它易于学习,支持多种数据库,并具有强大的社区支持。PHP代码通常嵌入到HTML文件中,以便在服务器端执行并生成动态内容。PHP还提供了各种框架,如Laravel、Symfony和CodeIgniter,以帮助开发人员更快地构建强大的Web应用程序。此外,PHP还支持RESTful API开发,以便构建能够与各种平台集成的Web服务。
作者其他创作
大纲/内容
基础语法
格式
以<?php开头,以?>结尾
如果脚本里只有php,后面的?>也可以不加
加?>反而会有提示
一般只有php的脚本,都不加?>
加?>反而会有提示
一般只有php的脚本,都不加?>
也有用<?=开头的
也有用<?这种开头的,this code is within short tags, but will only work if short_open_tag is enabled
语句以;结尾
可以放在文档任何位置,文件扩展名为.php
php脚本里可以放html css js,但php语句只能在php文件里运行
php脚本里可以放html css js,但php语句只能在php文件里运行
输出
echo
能输出一个以上的字符串,英文逗号隔开。不返回任何值,
echo '输出的内容1', '输出的内容2';
print
只能输出一个字符串,并始终返回1
一样
echo比print稍快,并且开销低
""和‘’
单引号里的都是字符串
单
echo '$a';输出是$a
双
echo "$a";输出的是$a的值
注释
单行
//
#
多行
/*
*/
*/
变量
$开头
字母或_开头
不用定义数据类型,php会根据值自动将变量转换为正确的数据类型
可以直接在html标签里用<?php $变量?>来插入一个已定义的变量
特殊声明方式
$$
$a = 'hello';
$$a = 'world';
$$a = 'world';
world这个值可以通过$$a访问,也可以用$hello
变量的变量在PHP中不是经常使用的特性,因为它可能导致代码难以理解和维护。
但在某些情况下,特别是在处理动态属性名称或动态创建变量时,它们可以非常有用。
但在某些情况下,特别是在处理动态属性名称或动态创建变量时,它们可以非常有用。
常量
不可变的值,具有全局作用域、区分大小写(默认情况下)的特性,并且一经设定就不能改变或重新定义。
定义
define()
define("CONSTANT_NAME", value);
const
const CONSTANT_NAME = value;
输出
echo CONSTANT_NAME;
常量+变量输出
echo CONSTANT_NAME. $variable;
get_defined_constants()
获取当前环境中所有常量
get_defined_constants(true)['user']
这个是自己定义的常量
魔术常量
__LINE__
文件中的当前行号
__FILE__
完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名
__DIR__
文件所在的目录
__FUNCTION__
函数名
__CLASS__
类的名称
__METHOD__
类的方法名
__NAMESPACE__
当前命名空间的名称
__TRAIT__
Trait(PHP 5.4.0 新增)的名字
大小写敏感
除了变量,其他所有包括(自定义函数,类和关键词)都对大小写不敏感
空白符
代码中可以有空格、换行、tab,实际效果自己看
echo '<br>';
换行
echo PHP_EOL;
在终端会输出换行,但在浏览器中只是空格
浏览器还是要用<br>换行
浏览器还是要用<br>换行
获取命令行输入
输入
$input = readline("请输入内容:");
echo "输入的内容是:", $input;
echo "输入的内容是:", $input;
echo"请输入内容:";
$input = fgets(STDIN);
echo"您输入的内容是:", $input;
$input = fgets(STDIN);
echo"您输入的内容是:", $input;
数据类型
查看数据类型
var_dump()
返回变量数据类型和值,一般用于开发调试
echo gettype($a)
返回$a的数据类型
字符串string
引号内的任何文本
单引号和双引号
‘’单引号直接输出引号里的内容
$a = 'a123';
echo 'a的值是$a';
echo 'a的值是$a';
a的值是$a
“”双引号会将其中的变量渲染出来
$a = 'a123';
echo "a的值是$a";
echo "a的值是$a";
a的值是a123
操作
combine
.
$Destination = " <p> " . $City . " is in " . $Country . ".</p>";
.=
$Destination = "<p>Paris";
$Destination .= "is in France.</p>";
$Destination .= "is in France.</p>";
转译
\
echo '<p>This code\'s going to work</p>';
双引号内的double quotation
整数int
必须至少一个数字(0-9)
十进制,十六进制(0x前缀),八进制(0前缀)都可以
浮点型float
带小数点的数字
10.3656
2.4e3
2.4*10的3次方
8e-5
8*10的-5次方
逻辑
true or false
数组
定义
array(“”,“”,“”);
[“”,“”,“”];
开头定义空数组,然后赋值
$array1 = [];
$array1[2] = "3";
$array1[2] = "3";
几种定义数组的形式
$Provinces[] = "Newfoundland and Labrador";
$Provinces[] = "Prince Edward Island";
$Provinces[] = "Nova Scotia";
$Provinces[] = "New Brunswick";
$Provinces[] = "Quebec";
$Provinces[] = "Ontario";
$Provinces[] = "Manitoba";
$Provinces[] = "Saskatchewan";
$Provinces[] = "Alberta";
$Provinces[] = "British Columbia";
$Provinces[] = "Prince Edward Island";
$Provinces[] = "Nova Scotia";
$Provinces[] = "New Brunswick";
$Provinces[] = "Quebec";
$Provinces[] = "Ontario";
$Provinces[] = "Manitoba";
$Provinces[] = "Saskatchewan";
$Provinces[] = "Alberta";
$Provinces[] = "British Columbia";
$Provinces = array(
"Newfoundland and Labrador",
"Prince Edward Island",
"Nova Scotia",
"New Brunswick",
"Quebec",
"Ontario",
"Manitoba",
"Saskatchewan",
"Alberta",
"British Columbia" );
"Newfoundland and Labrador",
"Prince Edward Island",
"Nova Scotia",
"New Brunswick",
"Quebec",
"Ontario",
"Manitoba",
"Saskatchewan",
"Alberta",
"British Columbia" );
键值对
$array2 = [
1,
2,
3,
"key1"=>'key1',
4,
];
1,
2,
3,
"key1"=>'key1',
4,
];
(
[0] => 1
[1] => 2
[2] => 3
[key1] => key1
[3] => 4
)
[0] => 1
[1] => 2
[2] => 3
[key1] => key1
[3] => 4
)
默认的键是从0开始的数字,可以再任意位置插入自定义键值对
多维数组
一般最多三四层
$cities = array(
"中国" => array(
"北京" => array(
"人口" => "2154万",
"特色美食" => "北京烤鸭"
),
"上海" => array(
"人口" => "2420万",
"特色美食" => "小笼包"
),
),
"日本" => array(
"东京" => array(
"人口" => "1396万",
"特色美食" => "寿司"
),
"大阪" => array(
"人口" => "269万",
"特色美食" => "章鱼烧"
),
),
"韩国" => array(
"首尔" => array(
"人口" => "977万",
"特色美食" => "泡菜"
),
"釜山" => array(
"人口" => "344万",
"特色美食" => "海鲜"
),
),
);
"中国" => array(
"北京" => array(
"人口" => "2154万",
"特色美食" => "北京烤鸭"
),
"上海" => array(
"人口" => "2420万",
"特色美食" => "小笼包"
),
),
"日本" => array(
"东京" => array(
"人口" => "1396万",
"特色美食" => "寿司"
),
"大阪" => array(
"人口" => "269万",
"特色美食" => "章鱼烧"
),
),
"韩国" => array(
"首尔" => array(
"人口" => "977万",
"特色美食" => "泡菜"
),
"釜山" => array(
"人口" => "344万",
"特色美食" => "海鲜"
),
),
);
第一层(中国,日本,韩国),第二层(城市),第三层(人口,特色美食)
遍历
foreach
对象
null
可以通过给变量赋值为null来清空变量数据
resource资源类型
“resource” data type is a special variable that holds a
reference to an external resource (e.g. XML file)
reference to an external resource (e.g. XML file)
定界符Heredoc
格式
<<<EOF开头,开头后面不能有空格
EOF;结尾,结尾要单独一行并且顶头
EOF可以用任意字符串代替,最好不要是常见的
EOF;结尾,结尾要单独一行并且顶头
EOF可以用任意字符串代替,最好不要是常见的
用法
中间的变量、html标签会被解析出来
单双引号不需要转义
双引号外的排列会被保留,双引号内的转译保留
单双引号不需要转义
双引号外的排列会被保留,双引号内的转译保留
echo <<< EOF
<a href="index.php">index</a>
<br>
EOF;
<a href="index.php">index</a>
<br>
EOF;
运算符
算数
赋值
递增/递减
unary operator一元运算符
unary operator一元运算符
比较
逻辑
优先级
&&(||)比and(or)优先级高
$bool = true && false;先算逻辑再赋值
$bool = true and false;先赋值再算逻辑
阻断效果
or前面的为true,就不会执行后面的语句,因为只要有一个为true就是true
and前面的为false,就不会执行后面的语句,因为必须两个都为true才能是ture
特殊
数组1+数组2
保留数组1的键值对,如果数组2中有重复的键,则忽略
三元
if-else的简写
CONDITIONAL OPERATORS
CONDITIONAL OPERATORS
condition ? expr1 : expr2
condition:一个条件表达式,其结果为 true 或 false。
expr1:如果 condition 为 true 时执行的表达式。
expr2:如果 condition 为 false 时执行的表达式。
例
$result = ($a > $b) ? "a is greater than b" : "b is greater or equal to a";
$result = $a ?: "a is not true";
空合并
??
7之后的版本才有
7之后的版本才有
$result = $a ?? $b;
如果变量 $a 存在且不为 null,则 $result 被赋值为 $a 的值;否则,其值为 $b。
$result = $a ?? $b ?? $c ?? "default";
$result 将被赋值为 $a、$b、$c 中第一个存在且非 null 的值。
如果这些变量都不存在或为 null,则 result 被赋值为 "default"。
如果这些变量都不存在或为 null,则 result 被赋值为 "default"。
组合比较符
<=>
7之后才有
7之后才有
$c = $a <=> $b;
a>b,c为1
a==b,c为0
a<b,c为-1
a==b,c为0
a<b,c为-1
数据类型的比较
is_numeric($a), is_int($a), is_string($a)等等,返回true or false
优先级
条件语句
if
if
if (条件)
{
执行的语句;
}
{
执行的语句;
}
if else
if (条件)
{
执行的语句;
}
else
{
执行的语句;
}
{
执行的语句;
}
else
{
执行的语句;
}
if elseif else
if (条件)
{
执行的语句;
}
elseif (条件)
{
执行的语句;
}
else
{
执行的语句;
}
{
执行的语句;
}
elseif (条件)
{
执行的语句;
}
else
{
执行的语句;
}
switch
switch (n)
{
case label1:
如果n=label1,执行;
break;
case label2:
如果n=label2,执行;
break;
default:
如果上面都不满足,执行;
}
{
case label1:
如果n=label1,执行;
break;
case label2:
如果n=label2,执行;
break;
default:
如果上面都不满足,执行;
}
这里只比较n和label的值,忽略数据类型
循环
for
for (初始值;条件;增量)
{
执行的循环体;
};
{
执行的循环体;
};
初始值和增量可为空,或多个用,隔开
for (;条件;)前后为空但;要留着
while
while (条件)
{
执行语句;
};
{
执行语句;
};
只要条件成立就一直循环
do
{
执行的语句;
};
while(条件);
{
执行的语句;
};
while(条件);
会至少执行一次代码,然后检查条件
continue和break
在循环里加条件
continue跳出这一次循环
break跳出整个循环
break n;从内向外数,跳出n个循环
(循环一般不要嵌套超过3个)
(循环一般不要嵌套超过3个)
foreach
遍历数组
foreach ($array2 as $value) {
echo $value;
echo '<br>';
};
echo "<br>";
foreach ($array2 as $key => $value) {
echo "$key => $value";
echo "<br>";
};
echo $value;
echo '<br>';
};
echo "<br>";
foreach ($array2 as $key => $value) {
echo "$key => $value";
echo "<br>";
};
函数
内置函数
print_r()
用于打印关于变量的易读信息,特别是用于输出数组和对象的结构。
number_format($变量,2)
$变量=1234567890.12345
转成1,234,567,890.12
小数点后保留两位
小数点后保留两位
unset($变量)
删除$变量
isset($变量)
判断$变量是否存在
is_*()
检查类型的函数
is_array($var):检查变量是否是数组。
is_bool($var):检查变量是否是布尔值。
is_float($var) 或 is_double($var):检查变量是否是浮点数。
is_int($var) 或 is_integer($var):检查变量是否是整数。
is_null($var):检查变量是否是 NULL。
is_numeric($var):检查变量是否是数字或数字字符串。
is_object($var):检查变量是否是对象。
is_resource($var):检查变量是否是资源类型。
is_scalar($var):检查变量是否是标量(整数、浮点数、字符串或布尔值)。
is_string($var):检查变量是否是字符串。
is_array($var):检查变量是否是数组。
is_bool($var):检查变量是否是布尔值。
is_float($var) 或 is_double($var):检查变量是否是浮点数。
is_int($var) 或 is_integer($var):检查变量是否是整数。
is_null($var):检查变量是否是 NULL。
is_numeric($var):检查变量是否是数字或数字字符串。
is_object($var):检查变量是否是对象。
is_resource($var):检查变量是否是资源类型。
is_scalar($var):检查变量是否是标量(整数、浮点数、字符串或布尔值)。
is_string($var):检查变量是否是字符串。
检查特定属性或特性的函数
is_callable($var):检查变量是否是可回调的。
is_countable($var):检查变量是否是可计数的(在 PHP 7.3.0 及以上版本可用)。
is_iterable($var):检查变量是否是可迭代的(在 PHP 7.1.0 及以上版本可用)。
is_callable($var):检查变量是否是可回调的。
is_countable($var):检查变量是否是可计数的(在 PHP 7.3.0 及以上版本可用)。
is_iterable($var):检查变量是否是可迭代的(在 PHP 7.1.0 及以上版本可用)。
文件系统相关函数
is_dir($filename):检查指定的文件名是否是目录。
is_executable($filename):检查指定的文件是否可执行。
is_file($filename):检查指定的文件名是否为普通文件。
is_link($filename):检查指定的文件是否是符号链接。
is_readable($filename):检查指定的文件是否可读。
is_writable($filename) 或 is_writeable($filename):检查指定的文件是否可写。
is_dir($filename):检查指定的文件名是否是目录。
is_executable($filename):检查指定的文件是否可执行。
is_file($filename):检查指定的文件名是否为普通文件。
is_link($filename):检查指定的文件是否是符号链接。
is_readable($filename):检查指定的文件是否可读。
is_writable($filename) 或 is_writeable($filename):检查指定的文件是否可写。
empty()
用于检查一个变量是否被认为是“空”的,返回布尔值
对于未定义的变量也返回true,所以用之前先保证变量已定义
对于未定义的变量也返回true,所以用之前先保证变量已定义
以下都返回ture:
“”,空字符
0,整数0
null
false
array(),空数组
“”,空字符
0,整数0
null
false
array(),空数组
gettype()
输出数据类型
round()
四舍五入
字符串相关函数
strlen()
获取字符串长度
str_word_count()
返回单词数量,number of words
strpos()
查找,区分大小写,返回第一次出现位置或false
strchr()
一个字符串中查找第一次出现的指定字符(或子字符串),并返回从该字符(或子字符串)开始到原字符串末尾的所有字符。
$text = "hello@example.com";
echo strchr($text, '@'); // 输出:@example.com
echo strchr($text, '@'); // 输出:@example.com
strrchr()
一个字符串中查找最后一次出现的指定字符(或子字符串),并返回从该字符开始到原字符串末尾的所有字符。
$text = "filename.txt.tar.gz";
echo strrchr($text, '.'); // 输出:.gz
echo strrchr($text, '.'); // 输出:.gz
str_replace()
查找字符串中所有匹配的子字符串,并将它们替换为新的字符串
大小写敏感
大小写敏感
$text = "Hello World!";
$newText = str_replace("World", "PHP", $text);
echo $newText; // 输出:Hello PHP!
$newText = str_replace("World", "PHP", $text);
echo $newText; // 输出:Hello PHP!
str_ireplace()
大小写不敏感版的str_replace()
strtok()
strtok(string, separators)
break a string into smaller strings, called tokens
它只返回第一个标记(即第一个分隔符之前的字符串)
要返回全部要遍历
要返回全部要遍历
Hello
world
this
is
a
test
world
this
is
a
test
str_split()
将字符串分割成数组,每个数组元素包含字符串中的一个字符。
array str_split ( string $string [, int $split_length = 1 ] )
参数
$string:需要被分割的输入字符串。
$split_length:可选参数,定义了每个数组元素中的字符数。默认值为 1,意味着每个数组元素将包含字符串中的一个字符。如果该参数大于 1,那么每个数组元素将包含字符串的一个子串,长度为 split_length 指定的值。
返回值
str_split()返回一个数组,每个元素是字符串的一部分。如果$split_length小于 1,str_split()会返回 false。
$string:需要被分割的输入字符串。
$split_length:可选参数,定义了每个数组元素中的字符数。默认值为 1,意味着每个数组元素将包含字符串中的一个字符。如果该参数大于 1,那么每个数组元素将包含字符串的一个子串,长度为 split_length 指定的值。
返回值
str_split()返回一个数组,每个元素是字符串的一部分。如果$split_length小于 1,str_split()会返回 false。
stripos()
同上,不区分大小写
strrpos()
查找,区分大小写返回最后一次出现位置或false
strripos()
同上,不区分大小写
explode()
拆分字符串
implode()
拼接字符串
strcasecmp()
strcmp()
similar_text()
levenshtein()
soundex()
metaphone()
strtoupper()
转大写
strtolower()
转小写
ucfirst()
首字母大写
lcfirst()
首字母小写
ucwords()
字符串中每个单词的首字母大写
str_replace($search, $replace, $string)
在$string里找$search,然后换成$replace
stripslashes()
strrev()
字符串反转
str_shuffle()
随机打乱一个字符串中的所有字符
trim()
去除两端空格
ltrim()
去除开头空格
rtrim()
去除尾部空格
substr($value, 2,3)
(string, start, optional length)
截取英文字符串de第2索引开始,取3个length
("woodworking project", -7)
project
("woodworking project", -5, -2)
oje
取到第-2个index
取到第-2个index
mb_substr()
同上,截取中文字符串
需要安装mbstring扩展
htmlspecialchars()
将特定的字符转换为 HTML 实体
防止用户提交的数据中包含的 HTML 代码被浏览器解释执行
防止用户提交的数据中包含的 HTML 代码被浏览器解释执行
&(和号)成为 &
"(双引号)成为 ",当 ENT_NOQUOTES 没有被设置时
'(单引号)成为 ' 或 ',仅当 ENT_QUOTES 被设置时
<(小于)成为 <
>(大于)成为 >
"(双引号)成为 ",当 ENT_NOQUOTES 没有被设置时
'(单引号)成为 ' 或 ',仅当 ENT_QUOTES 被设置时
<(小于)成为 <
>(大于)成为 >
html_specialcharacters_decode()
htmlspecialchars() 的逆操作
md5()
计算字符串的 MD5 散列
正则表达
preg_match(pattern, string)
数组相关函数
array()
创建数组
count()
计算数组中的元素个数或对象中的属性个数
array_pop()
删除并返回最后一个元素
array_push($array, $newElement)
元素添至末尾
array_unshift($array, $newElement)
元素添至开头
array_shift()
删除并返回第一个元素
array_slice($array, 起始位置,终止位置,是否保留原键<默认false>)
提取一部分,组成新数组
array_splice()
array_splice(array_name, start, number_to_delete, values_to_insert);
可删可加
unset()
unset($HospitalDepts[1], $HospitalDepts[2]);
removes array elements and other variables
array_values()
array_unique()
移除重复值,返回新数组,原数组不变
arrary_merge()
数组相加,键值对取最新的键
与数组+数组更新方式相反
与数组+数组更新方式相反
array_reverse()
反转元素顺序
is_array(值,$array)
检测是否存在某个值
array_key_exists(键名,$array)
检查是否存在某个键
array_keys()
返回所有键,组成新数组
(数组,值<可选>,是否严格<默认false>)
array_values()
返回所有值,组成新数组
array_search(值,键)
搜索给定值,返回对应键
max(),min()
最大最小值
sort()
升序
rsort()
降序
asort(), arsort(), ksort() and krsort()
array_combine()
array_diff()
array_intersect()
array_sum()
求和
只能算数字
array_product()
求积
只能算数字
array_rand()
array_rand ( array $array [, int $num = 1 ] ) : mixed
$array:输入的数组。
$num:(可选)指定要随机选择的元素数量。默认值为 1。
$num:(可选)指定要随机选择的元素数量。默认值为 1。
返回值
如果 num 为 1,array_rand() 返回随机元素的键名。
如果 num 大于 1,它返回一个包含随机键名的数组。这些键名不会按原数组中的顺序排列。
如果 num 为 1,array_rand() 返回随机元素的键名。
如果 num 大于 1,它返回一个包含随机键名的数组。这些键名不会按原数组中的顺序排列。
从前端获取数组
name='req[]':不指定数组键。这允许你提交具有相同名称的多个值,PHP 会自动将它们存储在一个索引数组中。索引会自动从 0 开始编号。
name='req[0]'、name='req[1]' 等:明确指定数组键。这对于你已经知道需要接收多少元素,或者当你想要确保特定值对应特定索引时非常有用。
name='req[Key1]'、name='req[Key2]' 等:使用字符串作为键。这在你需要接收关联数组时非常有用,例如,当表单的每个元素对应一个特定的标识符或名称时。
name='req[0]'、name='req[1]' 等:明确指定数组键。这对于你已经知道需要接收多少元素,或者当你想要确保特定值对应特定索引时非常有用。
name='req[Key1]'、name='req[Key2]' 等:使用字符串作为键。这在你需要接收关联数组时非常有用,例如,当表单的每个元素对应一个特定的标识符或名称时。
扩展
array_map()
array_walk()
时间日期 strftime($format, $timestamp)
time()
当前时间戳(10位)
microtime(true)
当前时间戳和微秒数
调用 microtime(true) 返回一个浮点数,表示当前时间
date(格式,时间戳)
日期格式化
返回本地服务器的时区
strtotime(“next Monday”)
字符串变成时间戳
输出下周一的时间戳
输出下周一的时间戳
可以加一个基础日期,(‘+1 day’,$base_time)
mktime($hour, $minute, $second, $month, $day, $year)
生成时间戳,要格式化的时间要重新转换
date_create()
创建日期
date_format()
格式化成指定字符串格式
date_diff()
计算时间差
时间戳格式化为可读,php8已废弃
gmdate($format, $timestamp)
返回格林威治标准时间(GMT)
date_default_timezone_set($timezone)
设置默认时区
只能在脚本开始时设置,不能在运行时动态设置
timezone_identifiers_list()
返回所有timezone
DateTIme对象
日后再看
文件操作
权限
chmod($filename, $mode)
更改权限
chmod(“myfile.txt”, 0754)
fileperms()
读取文件权限(返回十进制)
$perms = fileperms($testfile);
$perms = decoct($perms % 01000); //转成8进制
echo "file permissions for $testfile: 0" . $perms . "<br />\n";
$perms = decoct($perms % 01000); //转成8进制
echo "file permissions for $testfile: 0" . $perms . "<br />\n";
读
汇总
chdir(directory): 将当前 PHP 脚本的工作目录更改为指定的 directory。这只影响当前脚本。
chroot(directory): 改变当前进程的根目录到指定的 directory。这通常用于安全目的,以限制脚本可访问的目录(请注意,这个函数需要根权限,并且并非在所有系统上都可用)。
closedir(handle): 关闭由 opendir() 打开的目录句柄。
getcwd(): 获取当前工作目录的绝对路径。
opendir(directory): 打开一个指定的目录,并返回一个目录句柄,可用于之后的 readdir()、rewinddir() 和 closedir() 调用。
readdir(handle): 从由 opendir() 打开的目录句柄中读取一个条目。这可以是一个文件或目录,每次调用后指针都会向前移动。
rewinddir(handle): 重置由 opendir() 打开的目录句柄的位置指针到目录的开始。
scandir(directory[, sort]): 返回一个索引数组,包含指定目录中的文件和目录名。可选的 sort 参数可以定义排序顺序
chroot(directory): 改变当前进程的根目录到指定的 directory。这通常用于安全目的,以限制脚本可访问的目录(请注意,这个函数需要根权限,并且并非在所有系统上都可用)。
closedir(handle): 关闭由 opendir() 打开的目录句柄。
getcwd(): 获取当前工作目录的绝对路径。
opendir(directory): 打开一个指定的目录,并返回一个目录句柄,可用于之后的 readdir()、rewinddir() 和 closedir() 调用。
readdir(handle): 从由 opendir() 打开的目录句柄中读取一个条目。这可以是一个文件或目录,每次调用后指针都会向前移动。
rewinddir(handle): 重置由 opendir() 打开的目录句柄的位置指针到目录的开始。
scandir(directory[, sort]): 返回一个索引数组,包含指定目录中的文件和目录名。可选的 sort 参数可以定义排序顺序
组合读取
opendir()
先打开,返回一个handle类型
always返回 . 和 ..
always返回 . 和 ..
readdir()
每次调用时返回目录中的下一个条目
$dirOpen = opendir($dir); // $dirOpen is a handle
while ($files = readdir($dirOpen)) {
if ((strcmp($files, '.') != 0) && (strcmp($files, '..') != 0)) {
echo $files;
}
}
closedir($dirOpen);
while ($files = readdir($dirOpen)) {
if ((strcmp($files, '.') != 0) && (strcmp($files, '..') != 0)) {
echo $files;
}
}
closedir($dirOpen);
返回 string | false
closedir()
有开必有关
scandir()
相当于上面三个的组合
array scandir ( string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context ]]
参数
- **`$directory`**:必需参数,指定要扫描的目录的路径。
- **`$sorting_order`**:可选参数,用于确定返回数组的排序方式。可能的值有:
- `SCANDIR_SORT_ASCENDING` 或 `0`:升序排序(默认)。
- `SCANDIR_SORT_DESCENDING` 或 `1`:降序排序。
- 从 PHP 8.0 开始,还可以使用 `SCANDIR_SORT_NONE`,表示不排序。
- **`$context`**:可选参数,指定一个资源流上下文。这对于访问需要特殊上下文或权限的目录很有用。
- **`$sorting_order`**:可选参数,用于确定返回数组的排序方式。可能的值有:
- `SCANDIR_SORT_ASCENDING` 或 `0`:升序排序(默认)。
- `SCANDIR_SORT_DESCENDING` 或 `1`:降序排序。
- 从 PHP 8.0 开始,还可以使用 `SCANDIR_SORT_NONE`,表示不排序。
- **`$context`**:可选参数,指定一个资源流上下文。这对于访问需要特殊上下文或权限的目录很有用。
返回值
返回一个数组,包含指定目录中的文件和目录名称。如果失败,它将返回 `false`。
新建
mkdir()
mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )
参数
$pathname:必需。指定要创建的目录的路径。
$mode:可选。设置目录的访问权限。默认值是 0777,意味着最宽松的访问权限(在 Unix 系统上,这意味着任何用户都可以读取、写入和执行目录)。$mode 参数在 Windows 平台上被忽略。
$recursive:可选。如果设置为 true,允许创建多级嵌套的目录,即如果上级目录不存在,函数将自动创建。默认值是 false。
$context:可选。指定一个文件流上下文。这可以让你对文件操作使用特定的上下文选项,例如在使用网络文件系统时。
其他
FILE AND DIRECTORY
INFORMATION FUNCTIONS
INFORMATION FUNCTIONS
上传
一些常用HTML标签的属性
form标签的enctype="multipart/form-data"
enctype 属性:在 HTML 中,<form> 标签的 enctype 属性用于指定表单数据在发送给服务器之前应该如何编码。enctype 代表 "encoding type"(编码类型)。
multipart/form-data:这是 enctype 属性的一个值,用于处理包含文件上传的表单。当你的表单包含 <input type="file"> 元素时,就需要使用这个值。
指示浏览器以多部分形式发送数据:当设置 enctype="multipart/form-data" 时,这告诉浏览器需要将表单数据分为多个部分(sections)发送。这种方式允许一个部分包含常规的表单数据(如文本字段),而另一个部分可以包含文件内容。这对于文件上传至关重要,因为文件数据通常是二进制的,不能像常规表单数据那样进行URL编码。
简而言之,这段话的意思是:如果你的 HTML 表单需要上传文件,你必须在 <form> 标签中设置 enctype 属性为 "multipart/form-data"。这样做是为了告诉浏览器用特殊的方式发送表单数据,使之能同时包含常规表单字段和文件内容。这是实现文件上传功能的基础要求。
multipart/form-data:这是 enctype 属性的一个值,用于处理包含文件上传的表单。当你的表单包含 <input type="file"> 元素时,就需要使用这个值。
指示浏览器以多部分形式发送数据:当设置 enctype="multipart/form-data" 时,这告诉浏览器需要将表单数据分为多个部分(sections)发送。这种方式允许一个部分包含常规的表单数据(如文本字段),而另一个部分可以包含文件内容。这对于文件上传至关重要,因为文件数据通常是二进制的,不能像常规表单数据那样进行URL编码。
简而言之,这段话的意思是:如果你的 HTML 表单需要上传文件,你必须在 <form> 标签中设置 enctype 属性为 "multipart/form-data"。这样做是为了告诉浏览器用特殊的方式发送表单数据,使之能同时包含常规表单字段和文件内容。这是实现文件上传功能的基础要求。
input的type="hidden"
限制上传文件的大小
<input type="hidden" name="MAX_FILE_SIZE" value = "50000">
单位是字节,,这里是50kb
<input type="hidden" name="MAX_FILE_SIZE" value = "50000">
单位是字节,,这里是50kb
$_FILES
<input type="file" name="picture_file" />
$_FILES['picture_file']['name']
name:上传文件的原始名称(在客户端计算机上的名称)。
type:文件的 MIME 类型,由浏览器提供,不一定完全可靠。
size:上传文件的大小,单位是字节。
tmp_name:文件被上传到服务器时的临时存储路径。你可以使用 PHP 的 move_uploaded_file() 函数将文件从这个临时位置移动到一个永久位置。
error:与文件上传相关的错误代码。如果文件上传成功,此值为 UPLOAD_ERR_OK(等于 0)。
type:文件的 MIME 类型,由浏览器提供,不一定完全可靠。
size:上传文件的大小,单位是字节。
tmp_name:文件被上传到服务器时的临时存储路径。你可以使用 PHP 的 move_uploaded_file() 函数将文件从这个临时位置移动到一个永久位置。
error:与文件上传相关的错误代码。如果文件上传成功,此值为 UPLOAD_ERR_OK(等于 0)。
move_uploaded_file()
bool move_uploaded_file ( string $filename , string $destination )
参数
$filename:上传文件在服务器上的临时文件名。通常是 $_FILES['userfile']['tmp_name'],其中 'userfile' 是表单中文件输入字段的名称。
$destination:文件的新位置和新文件名。这个路径必须是相对于当前脚本的绝对路径,或者是一个完全的路径,从服务器的根目录开始。
返回值
成功时:返回 true。
失败时:返回 false。
$filename:上传文件在服务器上的临时文件名。通常是 $_FILES['userfile']['tmp_name'],其中 'userfile' 是表单中文件输入字段的名称。
$destination:文件的新位置和新文件名。这个路径必须是相对于当前脚本的绝对路径,或者是一个完全的路径,从服务器的根目录开始。
返回值
成功时:返回 true。
失败时:返回 false。
将上传的文件从临时目录移动到指定的新位置,还提供了重要的安全性检查,确保文件是通过 HTTP POST 上传的。
如果目标文件已经存在,move_uploaded_file() 将会覆盖它。
header()
return header information to the Web browser
Content-Description
描述:消息内容的描述。
值:文本消息。
示例:header("Content-Description: File Transfer");
这个头部通常在发送文件时用来描述消息的内容,告知接收方这是一个文件传输过程。
Content-Type
描述:MIME类型和消息内容的子类型。
值:MIME类型/子类型字符串。
示例:header("Content-Type: application/octet-stream");
这个头部指定了传输数据的类型。在上述示例中,application/octet-stream 通常用于文件下载,这意味着文件以二进制形式发送,且不属于任何特定的子类型。
Content-Disposition
描述:附件的属性,特别是文件名。
值:一系列定义文件属性的名称/值对。
示例:header("Content-Disposition: attachment; filename=\"list.txt\"");
这个头部指示浏览器处理消息内容作为一个附件,并提供一个默认的文件名。在这个例子中,浏览器会提示用户下载名为 "list.txt" 的文件。
Content-Transfer-Encoding
描述:用于编码消息内容的方法。
值:编码方法,如7bit、8bit、quoted-printable、base64、binary等。
示例:header("Content-Transfer-Encoding: base64");
虽然这个头部通常用于电子邮件消息,它定义了数据如何编码以适应传输要求。在网页上,它不是常见的做法,因为数据通常是在HTTP层面上编码的。
Content-Length
描述:消息内容的长度。
值:数字,指定内容的字节长度。
示例:header("Content-Length: 5000");
描述:消息内容的描述。
值:文本消息。
示例:header("Content-Description: File Transfer");
这个头部通常在发送文件时用来描述消息的内容,告知接收方这是一个文件传输过程。
Content-Type
描述:MIME类型和消息内容的子类型。
值:MIME类型/子类型字符串。
示例:header("Content-Type: application/octet-stream");
这个头部指定了传输数据的类型。在上述示例中,application/octet-stream 通常用于文件下载,这意味着文件以二进制形式发送,且不属于任何特定的子类型。
Content-Disposition
描述:附件的属性,特别是文件名。
值:一系列定义文件属性的名称/值对。
示例:header("Content-Disposition: attachment; filename=\"list.txt\"");
这个头部指示浏览器处理消息内容作为一个附件,并提供一个默认的文件名。在这个例子中,浏览器会提示用户下载名为 "list.txt" 的文件。
Content-Transfer-Encoding
描述:用于编码消息内容的方法。
值:编码方法,如7bit、8bit、quoted-printable、base64、binary等。
示例:header("Content-Transfer-Encoding: base64");
虽然这个头部通常用于电子邮件消息,它定义了数据如何编码以适应传输要求。在网页上,它不是常见的做法,因为数据通常是在HTTP层面上编码的。
Content-Length
描述:消息内容的长度。
值:数字,指定内容的字节长度。
示例:header("Content-Length: 5000");
file_put_contents()
file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) : int
$filename:要写入数据的文件。
$data:要写入的数据,可以是字符串或者是一个数组。如果 data 是数组,那么数组的值将被连续写入文件。
$flags:(可选)可以是 FILE_APPEND、LOCK_EX 或 FILE_USE_INCLUDE_PATH 中的一个或多个。
FILE_APPEND:如果文件已存在,追加数据到文件末尾。
LOCK_EX:获得一个独占锁定,写入数据前锁定文件。
FILE_USE_INCLUDE_PATH:在包含路径中搜索 filename。
$context:(可选)一个有效的上下文资源,创建自 stream_context_create()
$data:要写入的数据,可以是字符串或者是一个数组。如果 data 是数组,那么数组的值将被连续写入文件。
$flags:(可选)可以是 FILE_APPEND、LOCK_EX 或 FILE_USE_INCLUDE_PATH 中的一个或多个。
FILE_APPEND:如果文件已存在,追加数据到文件末尾。
LOCK_EX:获得一个独占锁定,写入数据前锁定文件。
FILE_USE_INCLUDE_PATH:在包含路径中搜索 filename。
$context:(可选)一个有效的上下文资源,创建自 stream_context_create()
return
成功时返回写入到文件中的字节数,
失败时返回 false。
失败时返回 false。
file_get_contents()
读取文件内容到一个字符串
file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = 0 [, int $maxlen ]]]] ) : string|false
$filename:要读取的文件名或 URL。
$use_include_path:(可选)如果设置为 true,函数将在 include_path 中查找文件。
$context:(可选)可以指定一个资源流的上下文,使用 stream_context_create() 创建。
$offset:(可选)在文件中开始读取的位置。
$maxlen:(可选)要读取的最大字节数。如果没有设置,则读取整个文件
$use_include_path:(可选)如果设置为 true,函数将在 include_path 中查找文件。
$context:(可选)可以指定一个资源流的上下文,使用 stream_context_create() 创建。
$offset:(可选)在文件中开始读取的位置。
$maxlen:(可选)要读取的最大字节数。如果没有设置,则读取整个文件
return
成功时,返回文件的内容作为一个字符串。
如果失败,则返回 false
如果失败,则返回 false
readfile()
readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] ) : int|false
$filename:要读取的文件名或者路径。
$use_include_path:(可选)如果设置为 true,函数会在 include_path 中查找指定的文件。
$context:(可选)一个有效的资源流上下文,可用于修改网络请求的行为。
$use_include_path:(可选)如果设置为 true,函数会在 include_path 中查找指定的文件。
$context:(可选)一个有效的资源流上下文,可用于修改网络请求的行为。
return
成功时,返回从文件中读取的字节数。
如果出错,则返回 false。
如果出错,则返回 false。
file()
读取文件并将文件内容按行分割成一个数组。每个数组元素包含文件中的一行,包括行末的换行符。
file ( string $filename [, int $flags = 0 [, resource $context ]] ) : array|false
$filename:要读取的文件的路径。
$flags:(可选)可以是以下标志的一个或多个的组合:
FILE_USE_INCLUDE_PATH:在 include_path 选项中搜索文件。
FILE_IGNORE_NEW_LINES:在数组每个元素的末尾不添加换行符。
FILE_SKIP_EMPTY_LINES:跳过空行,结果数组中不会包含空行。
$context:(可选)一个合法的上下文资源,可用于修改流的行为。
$flags:(可选)可以是以下标志的一个或多个的组合:
FILE_USE_INCLUDE_PATH:在 include_path 选项中搜索文件。
FILE_IGNORE_NEW_LINES:在数组每个元素的末尾不添加换行符。
FILE_SKIP_EMPTY_LINES:跳过空行,结果数组中不会包含空行。
$context:(可选)一个合法的上下文资源,可用于修改流的行为。
return
成功时,返回包含文件所有行的数组。
如果失败,返回 false。
如果失败,返回 false。
$lines = file('example.txt');
foreach ($lines as $line_num => $line) {
echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
foreach ($lines as $line_num => $line) {
echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
file steam
fopen()
open_file = fopen("text file", " method");
fclose()
fclose($handle);
fwrite()
fwrite($handle, data[, length]);
flock()
flock($handle, operation)
fgets()
fgets(resource $handle [, int $length ]) : string|false
fread()
feof()
copy()
copy(source, destination)
rename()
rename(old_name, new_name)
unlink()
delete files
rmdir()
delete directories (it does not work
unless the directory is empty)
unless the directory is empty)
file_exists()
htmlspecialchars()
`htmlspecialchars`是PHP中一个非常实用的函数,它的主要目的是将特定的字符转换为HTML实体。这对于预防跨站脚本攻击(XSS)非常重要,尤其是当你需要在网页上输出用户提供的数据时。XSS攻击是指攻击者通过在网站上注入恶意脚本,从而在其他用户的浏览器中执行这些脚本,可能导致信息泄露、会话劫持等安全问题。
### 函数原型
```php
htmlspecialchars(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = null, bool $double_encode = true): string
```
- `$string`:要转换的字符串。
- `$flags`:告诉函数如何处理引号和使用的HTML文档类型。常用的标志包括:
- `ENT_COMPAT`:将双引号转换为HTML实体,保留单引号不变(这是默认值)。
- `ENT_QUOTES`:将双引号和单引号都转换为HTML实体。
- `ENT_NOQUOTES`:不转换任何引号。
- `$encoding`:定义字符编码。如果未设置,将使用PHP的默认编码。
- `$double_encode`:当设置为`true`时,PHP会转换字符串中已经是HTML实体的字符(默认为`true`)。
### 如何工作
`htmlspecialchars`函数通过将字符转换为它们的HTML实体来工作。主要转换的字符包括:
- `&`(和号)成为 `&`
- `"`(双引号)成为 `"`,当`ENT_NOQUOTES`没有被设置时。
- `'`(单引号)成为 `'` 或 `'`,仅当`ENT_QUOTES`被设置时。
- `<`(小于号)成为 `<`
- `>`(大于号)成为 `>`
### 使用场景
当你需要在HTML文档中显示用户输入的数据时,应该总是使用`htmlspecialchars`来处理这些数据。例如,如果你有一个留言板应用,用户提交的留言将会被展示给其他用户看。在这种情况下,你应该在输出留言内容到HTML页面之前,使用`htmlspecialchars`处理这些内容:
```php
// 假设$userInput是用户输入的数据
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
```
这将确保即使用户输入的数据中包含有潜在的HTML或JavaScript代码,这些代码也不会被浏览器执行,而是作为普通文本显示。这对于保护网站和用户免受XSS攻击非常重要。
### 小结
`htmlspecialchars`是PHP中防止XSS攻击的重要工具之一,通过适当使用它来处理所有的用户输入,可以大大增强你的Web应用的安全性。
### 函数原型
```php
htmlspecialchars(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = null, bool $double_encode = true): string
```
- `$string`:要转换的字符串。
- `$flags`:告诉函数如何处理引号和使用的HTML文档类型。常用的标志包括:
- `ENT_COMPAT`:将双引号转换为HTML实体,保留单引号不变(这是默认值)。
- `ENT_QUOTES`:将双引号和单引号都转换为HTML实体。
- `ENT_NOQUOTES`:不转换任何引号。
- `$encoding`:定义字符编码。如果未设置,将使用PHP的默认编码。
- `$double_encode`:当设置为`true`时,PHP会转换字符串中已经是HTML实体的字符(默认为`true`)。
### 如何工作
`htmlspecialchars`函数通过将字符转换为它们的HTML实体来工作。主要转换的字符包括:
- `&`(和号)成为 `&`
- `"`(双引号)成为 `"`,当`ENT_NOQUOTES`没有被设置时。
- `'`(单引号)成为 `'` 或 `'`,仅当`ENT_QUOTES`被设置时。
- `<`(小于号)成为 `<`
- `>`(大于号)成为 `>`
### 使用场景
当你需要在HTML文档中显示用户输入的数据时,应该总是使用`htmlspecialchars`来处理这些数据。例如,如果你有一个留言板应用,用户提交的留言将会被展示给其他用户看。在这种情况下,你应该在输出留言内容到HTML页面之前,使用`htmlspecialchars`处理这些内容:
```php
// 假设$userInput是用户输入的数据
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
```
这将确保即使用户输入的数据中包含有潜在的HTML或JavaScript代码,这些代码也不会被浏览器执行,而是作为普通文本显示。这对于保护网站和用户免受XSS攻击非常重要。
### 小结
`htmlspecialchars`是PHP中防止XSS攻击的重要工具之一,通过适当使用它来处理所有的用户输入,可以大大增强你的Web应用的安全性。
htmlentities()
`htmlentities()` 是 PHP 中的一个函数,用于将字符转换为相应的 HTML 实体。这个函数主要用于防止 HTML 注入,确保用户提交的数据在显示在网页上时不会被解释为 HTML 代码。这对于提高网站安全性,防止跨站脚本(XSS)攻击非常重要。
### 语法
```php
htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] ) : string
```
- `$string`:要转换的字符串。
- `$flags`:转换时使用的标志。`ENT_COMPAT`(默认)只转换双引号,`ENT_QUOTES` 转换双引号和单引号,`ENT_NOQUOTES` 两者都不转换。
- `$encoding`:定义字符的编码。如果省略,默认使用 PHP 的 `default_charset` 配置项。
- `$double_encode`:当设置为 `true`(默认)时,PHP 会转换字符串中已经是 HTML 实体的字符。设置为 `false` 时,PHP 不会转换已经是 HTML 实体的字符。
### 返回值
返回转换后的字符串,如果输入的 `string` 包含不支持的字符编码,则返回一个空字符串。
### 示例
**基本使用**:
```php
$str = "A 'quote' is <b>bold</b>";
// 输出:A 'quote' is <b>bold</b>
echo htmlentities($str);
```
在这个例子中,`htmlentities()` 将小于号 `<`、大于号 `>` 转换成了对应的 HTML 实体 `<` 和 `>`,这使得字符串在网页中显示时,`<b>` 标签不会被浏览器作为 HTML 解释,而是按照普通文本显示。
**转换所有的引号**:
```php
$str = "A 'quote' is <b>bold</b>";
// 输出:A 'quote' is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
```
设置 `ENT_QUOTES` 标志会使 `htmlentities()` 转换字符串中的单引号和双引号为 HTML 实体。
### 注意事项
- 使用 `htmlentities()` 可以帮助防止 XSS 攻击,但应该在输出数据到 HTML 页面时使用它,而不是在将数据保存到数据库时。
- 如果你的数据已经包含 HTML 实体,注意 `double_encode` 参数的设置,以避免重复转换。
- 根据你的具体需求,有时 `htmlspecialchars()` 函数可能是更合适的选择,因为它只转换对 HTML 文档结构有实际影响的字符(如 `<`, `>`, `&`, `"`),而 `htmlentities()` 会转换所有能转换为 HTML 实体的字符。
### 语法
```php
htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] ) : string
```
- `$string`:要转换的字符串。
- `$flags`:转换时使用的标志。`ENT_COMPAT`(默认)只转换双引号,`ENT_QUOTES` 转换双引号和单引号,`ENT_NOQUOTES` 两者都不转换。
- `$encoding`:定义字符的编码。如果省略,默认使用 PHP 的 `default_charset` 配置项。
- `$double_encode`:当设置为 `true`(默认)时,PHP 会转换字符串中已经是 HTML 实体的字符。设置为 `false` 时,PHP 不会转换已经是 HTML 实体的字符。
### 返回值
返回转换后的字符串,如果输入的 `string` 包含不支持的字符编码,则返回一个空字符串。
### 示例
**基本使用**:
```php
$str = "A 'quote' is <b>bold</b>";
// 输出:A 'quote' is <b>bold</b>
echo htmlentities($str);
```
在这个例子中,`htmlentities()` 将小于号 `<`、大于号 `>` 转换成了对应的 HTML 实体 `<` 和 `>`,这使得字符串在网页中显示时,`<b>` 标签不会被浏览器作为 HTML 解释,而是按照普通文本显示。
**转换所有的引号**:
```php
$str = "A 'quote' is <b>bold</b>";
// 输出:A 'quote' is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
```
设置 `ENT_QUOTES` 标志会使 `htmlentities()` 转换字符串中的单引号和双引号为 HTML 实体。
### 注意事项
- 使用 `htmlentities()` 可以帮助防止 XSS 攻击,但应该在输出数据到 HTML 页面时使用它,而不是在将数据保存到数据库时。
- 如果你的数据已经包含 HTML 实体,注意 `double_encode` 参数的设置,以避免重复转换。
- 根据你的具体需求,有时 `htmlspecialchars()` 函数可能是更合适的选择,因为它只转换对 HTML 文档结构有实际影响的字符(如 `<`, `>`, `&`, `"`),而 `htmlentities()` 会转换所有能转换为 HTML 实体的字符。
自定义function
创建
function funcName($参数){}
不用加分号,
分号的作用是作为语句的解暑符,而函数定义本身就是一个完整的结构
不用加分号,
分号的作用是作为语句的解暑符,而函数定义本身就是一个完整的结构
参数
function funcName($参数){}
function funcName($参数1, $参数2,...){}
function funcName(int $参数){}
规定参数数据类型
非严格模式下,不同数据类型的参数会自动转换
严格模式
declare(strict_types= 1);
在一个php文件中,严格模式的声明必须首句
declare(strict_types= 1);
在一个php文件中,严格模式的声明必须首句
<?php
declare(strict_types= 1);
?>
<a href="index.php">index</a>
<br>
<?php
function test_func(int $a, int $b){
$c = $a + $b;
echo "$a+$b=$c";
}
test_func(1,2);
?>
declare(strict_types= 1);
?>
<a href="index.php">index</a>
<br>
<?php
function test_func(int $a, int $b){
$c = $a + $b;
echo "$a+$b=$c";
}
test_func(1,2);
?>
严格模式下,非规定类型的参数会报错
传参
传参方式
A function parameter that is passed by value is a local copy of the
variable
variable
function addOne($number) {
$number += 1; // 只修改局部变量的副本
}
$original = 1;
addOne($original);
echo $original; // 输出 1,原始变量未改变
$number += 1; // 只修改局部变量的副本
}
$original = 1;
addOne($original);
echo $original; // 输出 1,原始变量未改变
A function parameter that is passed by reference is a reference to
the original variable
the original variable
function addOne(&$number) {
$number += 1; // 直接修改原始变量
}
$original = 1;
addOne($original);
echo $original; // 输出 2,原始变量被修改
$number += 1; // 直接修改原始变量
}
$original = 1;
addOne($original);
echo $original; // 输出 2,原始变量被修改
传参个数
function sum(...$numbers)
不定参数必须放在最后
可选参数optional parameters
function makecoffee($type = "cappuccino")
{
return "<p>Making a cup of $type. </p>";
}
;
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
{
return "<p>Making a cup of $type. </p>";
}
;
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
传null的话,清空参数
规定参数数据类型OPTIONAL TYPE DECLARATIONS
function double_num(int $number): int
{
return $number *= 2;
}
{
return $number *= 2;
}
输入int,输出int
function double_number(int|float $number): int|float
{
return $number *= 2;
}
{
return $number *= 2;
}
php8才有的
命名参数NAMED ARGUMENTS
function make_sentence($name, $activity = "no activity", $hours = "")
{
return "Hi $name, you have $activity for $hours hrs";
}
echo make_sentence(activity: "hiking", name: "John", hours: "8");
{
return "Hi $name, you have $activity for $hours hrs";
}
echo make_sentence(activity: "hiking", name: "John", hours: "8");
返回值
return
只能返回一个值
没有返回值默认返回null
作用域
global
在函数内部使用全局变量
$GlobalVariable = "this is my value";
function scopeExample()
{
global $GlobalVariable;
echo "<p>$GlobalVariable</p>";
$GlobalVariable = "if I change it";
}
scopeExample();
echo "<p>$GlobalVariable</p>";
function scopeExample()
{
global $GlobalVariable;
echo "<p>$GlobalVariable</p>";
$GlobalVariable = "if I change it";
}
scopeExample();
echo "<p>$GlobalVariable</p>";
this is my value
if I change it
if I change it
超级全局变量
Autoglobal variables
Autoglobal variables
$GLOBALS
$GLOBALS 是一个超级全局变量数组,它存储了所有PHP脚本中定义的全局变量。
通过使用 $GLOBALS 数组,可以在一个PHP脚本中访问在另一个脚本中定义的全局变量。
这使得在不同脚本间共享数据变得相对容易。
通过使用 $GLOBALS 数组,可以在一个PHP脚本中访问在另一个脚本中定义的全局变量。
这使得在不同脚本间共享数据变得相对容易。
$_SERVER
https://m.runoob.com/php/php-superglobals.html
$_GET:一个关联数组,包含了通过 GET 方法提交到脚本的变量。
$_POST:一个关联数组,包含了通过 POST 方法提交到脚本的变量。
$_REQUEST:一个关联数组,包含了 $_GET、$_POST 和 $_COOKIE 的内容。
$_SESSION:一个关联数组,包含了当前会话中的所有会话变量。
$_COOKIE:一个关联数组,包含了通过 HTTP Cookies 提交到脚本的变量。
$_FILES:一个关联数组,包含了通过 HTTP POST 文件上传提交到脚本的项目。
$_ENV:一个关联数组,包含了通过环境方式提交到脚本的变量。
$_SERVER:一个关联数组,包含了诸如头信息、路径以及脚本位置等信息。
$_POST:一个关联数组,包含了通过 POST 方法提交到脚本的变量。
$_REQUEST:一个关联数组,包含了 $_GET、$_POST 和 $_COOKIE 的内容。
$_SESSION:一个关联数组,包含了当前会话中的所有会话变量。
$_COOKIE:一个关联数组,包含了通过 HTTP Cookies 提交到脚本的变量。
$_FILES:一个关联数组,包含了通过 HTTP POST 文件上传提交到脚本的项目。
$_ENV:一个关联数组,包含了通过环境方式提交到脚本的变量。
$_SERVER:一个关联数组,包含了诸如头信息、路径以及脚本位置等信息。
static
函数调用结束后,局部变量都会被删除
static可以保留局部变量前一次被调用的值
static可以保留局部变量前一次被调用的值
function static_func(){
$a = 0;
echo $a;
$a++;
echo "<br>";
}
static_func();
static_func();
static_func();
$a = 0;
echo $a;
$a++;
echo "<br>";
}
static_func();
static_func();
static_func();
0
0
0
0
0
function static_func(){
static $a = 0;
echo $a;
$a++;
echo "<br>";
}
static_func();
static_func();
static_func();
static $a = 0;
echo $a;
$a++;
echo "<br>";
}
static_func();
static_func();
static_func();
0
1
2
1
2
调用
调用的时候,函数名大小写不敏感
包含
include
include './somefile.php';
如果要包含的文件不存在,会发出警告(E_WARNING),但脚本会继续执行。
include_once
只执行一次
比如被包含的文件里声明了一个函数,如果多次include,相当于声明了多次
相当于把被包含的文件里所有代码复制粘贴过来
require(用法和include完全一样)
require 'somefile.php';
如果要包含的文件不存在,会发出致命错误(E_COMPILE_ERROR),并停止脚本的执行。
require_once
只执行一次
面向对象
定义类
class 类名{
}
}
调用
$变量 = new 类名;
实例化
实例化
echo $变量->name;类属性
echo $变量->eat();类方法
echo $变量->eat();类方法
类方法和属性
public $name = '猫咪';
public function eat(){
}
public function eat(){
}
$this
在类里调用自身的属性
$this->name
类常量
const
不可变性:一旦定义,常量的值就不能更改。
全局可访问性:可以在类的外部通过类名访问。
作用域:常量是属于类本身的,而不是属于类的实例。
全局可访问性:可以在类的外部通过类名访问。
作用域:常量是属于类本身的,而不是属于类的实例。
class MyClass {
const CONSTANT = 'constant value';
public function showConstant() {
echo self::CONSTANT;
}
}
echo MyClass::CONSTANT; // 输出 'constant value'
const CONSTANT = 'constant value';
public function showConstant() {
echo self::CONSTANT;
}
}
echo MyClass::CONSTANT; // 输出 'constant value'
类的访问控制
public
公有的类成员,可以在任何地方被访问
private
私有,只能被定义所在的类访问
protected
收保护的,可以被自身、其子类访问
构造函数
__construct
构造函数在每次创建类的新实例时自动调用。
通常用于初始化对象的属性或执行一些类实例化时的启动任务。
类似Python类的__init__
通常用于初始化对象的属性或执行一些类实例化时的启动任务。
类似Python类的__init__
class MyClass {
public function __construct($param) {
echo "构造函数被调用,参数值为: $param<br>";
}
}
$obj = new MyClass("Hello");
public function __construct($param) {
echo "构造函数被调用,参数值为: $param<br>";
}
}
$obj = new MyClass("Hello");
Constructor Property Promotion
可以这么写
class Point {
public function __construct(
public float $x,
public float $y,
public float $z
) {}
}
public function __construct(
public float $x,
public float $y,
public float $z
) {}
}
析构函数
__destruct
析构函数在对象不再被使用时自动调用,即当对象被销毁时。
通常用于执行清理工作,如关闭文件、释放资源等。
当对象不再被调用或脚本执行结束时,会被自动调用。
一般用不上
通常用于执行清理工作,如关闭文件、释放资源等。
当对象不再被调用或脚本执行结束时,会被自动调用。
class MyClass {
public function __destruct() {
echo "析构函数被调用<br>";
}
}
$obj = new MyClass();
unset($obj); // 显示调用析构函数
public function __destruct() {
echo "析构函数被调用<br>";
}
}
$obj = new MyClass();
unset($obj); // 显示调用析构函数
magic function
__set()
__get()
static
静态变量
没有实例化(创建类对象),也可以访问类的静态属性(静态变量)
class MyClass {
public static $staticVar = "I am static";
public function displayStaticVar() {
return self::$staticVar; // 访问静态变量
}
}
echo MyClass::$staticVar; // 直接通过类名访问
public static $staticVar = "I am static";
public function displayStaticVar() {
return self::$staticVar; // 访问静态变量
}
}
echo MyClass::$staticVar; // 直接通过类名访问
静态方法
可以通过类名直接调用,不需要类的实例。
class MyClass {
public static function myStaticMethod() {
echo "静态方法";
}
}
// 直接调用静态方法,不需要实例化 MyClass
MyClass::myStaticMethod();
public static function myStaticMethod() {
echo "静态方法";
}
}
// 直接调用静态方法,不需要实例化 MyClass
MyClass::myStaticMethod();
调用静态属性、静态方法
class MyClass {
public static $staticVar = "静态属性";
public static function anotherStaticMethod() {
echo " 另一个静态方法";
}
public static function staticMethod() {
echo "静态方法调用 " . self::$staticVar; // 访问静态属性
self::anotherStaticMethod(); // 调用另一个静态方法
}
}
MyClass::staticMethod();
public static $staticVar = "静态属性";
public static function anotherStaticMethod() {
echo " 另一个静态方法";
}
public static function staticMethod() {
echo "静态方法调用 " . self::$staticVar; // 访问静态属性
self::anotherStaticMethod(); // 调用另一个静态方法
}
}
MyClass::staticMethod();
调用非静态属性、非静态方法
class MyClass {
public $nonStaticVar = "非静态属性";
public function nonStaticMethod() {
echo "非静态方法";
}
public static function staticMethod() {
$instance = new self(); // 创建类的实例
echo $instance->nonStaticVar; // 访问非静态属性
$instance->nonStaticMethod(); // 调用非静态方法
}
}
MyClass::staticMethod();
public $nonStaticVar = "非静态属性";
public function nonStaticMethod() {
echo "非静态方法";
}
public static function staticMethod() {
$instance = new self(); // 创建类的实例
echo $instance->nonStaticVar; // 访问非静态属性
$instance->nonStaticMethod(); // 调用非静态方法
}
}
MyClass::staticMethod();
也可以直接用(new self())->非静态属性(方法)
self不加()也能被解析出来,但加()严谨一些
继承
extends
class 子类 extends 父类{
}
}
父类的属性
父类的protected属性可以在子类内部访问
但不能单纯地通过实例化子类访问父类的protected
但不能单纯地通过实例化子类访问父类的protected
class Animal{
protected $name = "animal";
}
class Cat extends Animal{}
$cat = new Cat();
$cat->name;
protected $name = "animal";
}
class Cat extends Animal{}
$cat = new Cat();
$cat->name;
Cannot access protected property Cat::$name
class Cat extends Animal{
public function getName(){
echo $this->name;
}
}
public function getName(){
echo $this->name;
}
}
在子类里声明一个调用父类protected的方法
父类的private属性无法访问
父类的方法
parent::
class ParentClass {
public function display() {
echo "这是父类的方法<br>";
}
}
class ChildClass extends ParentClass {
public function display() {
parent::display(); // 调用父类的方法
echo "这是子类的方法<br>";
}
}
$child = new ChildClass();
$child->display();
public function display() {
echo "这是父类的方法<br>";
}
}
class ChildClass extends ParentClass {
public function display() {
parent::display(); // 调用父类的方法
echo "这是子类的方法<br>";
}
}
$child = new ChildClass();
$child->display();
final
禁止类、类方法被继承
无法作用于类属性
无法作用于类属性
静态延迟绑定 static
问题场景
在面向对象编程中,当子类继承父类时,
如果在父类的静态方法中使用 self 关键字,
self 将总是引用原始类(即定义该方法的类),而不是运行时的类。
如果在父类的静态方法中使用 self 关键字,
self 将总是引用原始类(即定义该方法的类),而不是运行时的类。
class ParentClass {
public static function who() {
echo self::getName();
}
public static function getName() {
return 'ParentClass';
}
}
class ChildClass extends ParentClass {
public static function getName() {
return 'ChildClass';
}
}
ChildClass::who(); // 输出 "ParentClass"
public static function who() {
echo self::getName();
}
public static function getName() {
return 'ParentClass';
}
}
class ChildClass extends ParentClass {
public static function getName() {
return 'ChildClass';
}
}
ChildClass::who(); // 输出 "ParentClass"
引入static关键字
现在,static::getName() 会根据运行时的类来解析
class ParentClass {
public static function who() {
echo static::getName(); // 使用 static 而不是 self
}
public static function getName() {
return 'ParentClass';
}
}
class ChildClass extends ParentClass {
public static function getName() {
return 'ChildClass';
}
}
ChildClass::who(); // 现在输出 "ChildClass"
public static function who() {
echo static::getName(); // 使用 static 而不是 self
}
public static function getName() {
return 'ParentClass';
}
}
class ChildClass extends ParentClass {
public static function getName() {
return 'ChildClass';
}
}
ChildClass::who(); // 现在输出 "ChildClass"
重载
没太懂
在PHP中,"重载"(Overloading)的概念与在其他一些编程语言中的含义不同。在PHP中,重载是一种动态捕获对未定义或不可访问的类属性和方法的访问的能力。重载是通过魔术方法来实现的,而不是通过创建多个同名但参数不同的方法。
### PHP中的重载涉及以下几个魔术方法:
1. **属性重载**:
- `__set($name, $value)`:尝试给不可访问的属性赋值时触发。
- `__get($name)`:读取不可访问的属性时触发。
- `__isset($name)`:使用`isset()`或`empty()`检测不可访问的属性时触发。
- `__unset($name)`:对不可访问的属性使用`unset()`时触发。
2. **方法重载**:
- `__call($name, $arguments)`:以对象方式调用不可访问的方法时触发。
- `__callStatic($name, $arguments)`:以静态方式调用不可访问的方法时触发。
### 示例:
```php
class MyClass {
public function __get($name) {
echo "读取属性:$name<br>";
}
public function __set($name, $value) {
echo "设置属性:$name 为 $value<br>";
}
public function __call($name, $arguments) {
echo "调用方法:$name,参数:" . implode(', ', $arguments) . "<br>";
}
}
$obj = new MyClass();
$obj->a = 1; // 设置属性:a 为 1
echo $obj->a; // 读取属性:a
$obj->myMethod('hello', 'world'); // 调用方法:myMethod,参数:hello, world
```
在这个例子中,属性`a`和方法`myMethod`并没有在`MyClass`中明确定义。通过实现魔术方法,类`MyClass`能够动态地“处理”这些操作。
### 总结:
在PHP中,重载主要是指动态处理对未定义或不可访问的属性和方法的访问,而不是根据参数列表的不同来创建多个同名的方法。这种特性使PHP的面向对象编程更加灵活,但也要求程序员更加小心地使用这些魔术方法,以避免潜在的混淆和维护问题。🦌🔮👨💻
### PHP中的重载涉及以下几个魔术方法:
1. **属性重载**:
- `__set($name, $value)`:尝试给不可访问的属性赋值时触发。
- `__get($name)`:读取不可访问的属性时触发。
- `__isset($name)`:使用`isset()`或`empty()`检测不可访问的属性时触发。
- `__unset($name)`:对不可访问的属性使用`unset()`时触发。
2. **方法重载**:
- `__call($name, $arguments)`:以对象方式调用不可访问的方法时触发。
- `__callStatic($name, $arguments)`:以静态方式调用不可访问的方法时触发。
### 示例:
```php
class MyClass {
public function __get($name) {
echo "读取属性:$name<br>";
}
public function __set($name, $value) {
echo "设置属性:$name 为 $value<br>";
}
public function __call($name, $arguments) {
echo "调用方法:$name,参数:" . implode(', ', $arguments) . "<br>";
}
}
$obj = new MyClass();
$obj->a = 1; // 设置属性:a 为 1
echo $obj->a; // 读取属性:a
$obj->myMethod('hello', 'world'); // 调用方法:myMethod,参数:hello, world
```
在这个例子中,属性`a`和方法`myMethod`并没有在`MyClass`中明确定义。通过实现魔术方法,类`MyClass`能够动态地“处理”这些操作。
### 总结:
在PHP中,重载主要是指动态处理对未定义或不可访问的属性和方法的访问,而不是根据参数列表的不同来创建多个同名的方法。这种特性使PHP的面向对象编程更加灵活,但也要求程序员更加小心地使用这些魔术方法,以避免潜在的混淆和维护问题。🦌🔮👨💻
多态
多态性允许不同类的对象对相同的消息作出不同的响应。
多态性通过方法重写(覆盖)和方法重载来实现。
方法重写是指子类重写父类的方法,以改变方法的实现细节。
方法重载是指在同一个类中根据参数个数或类型不同来实现不同功能。
需要注意的是,多态性只适用于继承关系的类。子类必须重写父类的方法才能实现多态性。
多态是面向对象编程中的一个核心概念,它指的是同一个方法或属性在不同的类实例中可以有不同的实现。
在PHP中,多态主要是通过继承和接口来实现的,它允许你使用统一的接口来处理不同的类实例,这些类实例实现了相同的方法或属性,但各自有不同的行为。
多态性通过方法重写(覆盖)和方法重载来实现。
方法重写是指子类重写父类的方法,以改变方法的实现细节。
方法重载是指在同一个类中根据参数个数或类型不同来实现不同功能。
需要注意的是,多态性只适用于继承关系的类。子类必须重写父类的方法才能实现多态性。
多态是面向对象编程中的一个核心概念,它指的是同一个方法或属性在不同的类实例中可以有不同的实现。
在PHP中,多态主要是通过继承和接口来实现的,它允许你使用统一的接口来处理不同的类实例,这些类实例实现了相同的方法或属性,但各自有不同的行为。
实现多态的两种主要方式:
继承(Inheritance):子类继承父类,并重写(Override)父类的方法。在这种情况下,即使子类对象被视为父类类型,它仍然可以调用重写的方法,从而展现出不同的行为。
接口(Interface):不同的类实现同一个接口。这些类可以有不同的行为实现,但都遵循相同的方法签名,这允许你以统一的方式处理这些不同的对象。
继承(Inheritance):子类继承父类,并重写(Override)父类的方法。在这种情况下,即使子类对象被视为父类类型,它仍然可以调用重写的方法,从而展现出不同的行为。
接口(Interface):不同的类实现同一个接口。这些类可以有不同的行为实现,但都遵循相同的方法签名,这允许你以统一的方式处理这些不同的对象。
接口interface
定义一组方法,但不提供这些方法的具体实现。
接口是一种确保某些类包含特定方法的方式,它定义了类的行为规范,但将具体的实现留给了类本身。
接口是一种确保某些类包含特定方法的方式,它定义了类的行为规范,但将具体的实现留给了类本身。
接口里的方法,在implements的类里一定要提供其实现
接口中定义的常量,可以在类中直接使用,但不能被重写或取消定义。
接口中定义的常量,可以在类中直接使用,但不能被重写或取消定义。
interface MyInterface {
const CONSTANT = 'SomeValue'; //常量
public function method1(); //方法
function method2(); // 默认public
}
const CONSTANT = 'SomeValue'; //常量
public function method1(); //方法
function method2(); // 默认public
}
class Cat implements MyInterface{
public function a(){ };
public function b(){ };
}
public function a(){ };
public function b(){ };
}
抽象类和抽象方法abstract
抽象类
抽象类是一种特殊的类,只能被继承,不能被实例化
抽象类用于定义一组相关的方法,但这些方法的具体实现由继承它的子类来完成。
子类继承抽象类后,必须实现抽象类中的所有抽象方法。
抽象类可以包含抽象方法和普通方法的实现
抽象类用于定义一组相关的方法,但这些方法的具体实现由继承它的子类来完成。
子类继承抽象类后,必须实现抽象类中的所有抽象方法。
抽象类可以包含抽象方法和普通方法的实现
abstract class Animals{ }
抽象方法
抽象方法是没有具体实现的方法,只有方法的声明,而不需要方法体。
抽象方法只能存在于抽象类中。
可以使用protected,但不能使用private私有。
抽象方法只能存在于抽象类中。
可以使用protected,但不能使用private私有。
abstract public function xxx();
abstract protected function xxx();
abstract protected function xxx();
抽象类与接口的区别
1. 抽象类可以包含非抽象方法的实现,而接口只能包含方法的声明,没有方法的实现。
2. 类只能继承一个抽象类,但可以实现多个接口。
3. 抽象类可以有构造函数,而接口不能有构造函数。
4. 抽象类中的方法可以有public、protected和private访问修饰符,而接口中的方法只能是
public。
5. 子类继承抽象类时,必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。
子类实现接口时,必须实现接口中的所有方法。
2. 类只能继承一个抽象类,但可以实现多个接口。
3. 抽象类可以有构造函数,而接口不能有构造函数。
4. 抽象类中的方法可以有public、protected和private访问修饰符,而接口中的方法只能是
public。
5. 子类继承抽象类时,必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。
子类实现接口时,必须实现接口中的所有方法。
trait
解决类的单一继承问题
可同时使用多个trait,用逗号隔开
把常用的、通用的代码抽离出来,写成trait
trait里面不能有类常量,且trait不能被实例化。
可同时使用多个trait,用逗号隔开
把常用的、通用的代码抽离出来,写成trait
trait里面不能有类常量,且trait不能被实例化。
trait中可使用抽象方法
trait中可使用静态属性和静态方法
trait中可使用其他trait
trait中可使用parent
trait中可使用静态属性和静态方法
trait中可使用其他trait
trait中可使用parent
trait MyTrait {
public function myFunction() {
echo "Hello from MyTrait";
}
}
public function myFunction() {
echo "Hello from MyTrait";
}
}
class MyClass {
use MyTrait;
}
$obj = new MyClass();
$obj->myFunction(); // 输出 "Hello from MyTrait"
use MyTrait;
}
$obj = new MyClass();
$obj->myFunction(); // 输出 "Hello from MyTrait"
同名冲突
当一个类同时引入了多个Trait,并且这些Trait中存在同名方法时,就会产生方法冲突
不能解决同名属性冲突,要避免同名属性
不能解决同名属性冲突,要避免同名属性
use A,B{
B::eat insteadof A;
//别名定义
A::eat as Aeat;
//还可以改变方法的作用于
B::eat as protected eat;
}
B::eat insteadof A;
//别名定义
A::eat as Aeat;
//还可以改变方法的作用于
B::eat as protected eat;
}
MySQL
连接
0 条评论
下一页