PHP
2024-02-08 08:08:45 1 举报
AI智能生成
PHP(PHP: Hypertext Preprocessor,超文本预处理器)是一种广泛使用的开源服务器端脚本语言,主要用于开发动态网站和Web应用程序。它易于学习,支持多种数据库,并具有强大的社区支持。PHP代码通常嵌入到HTML文件中,以便在服务器端执行并生成动态内容。PHP还提供了各种框架,如Laravel、Symfony和CodeIgniter,以帮助开发人员更快地构建强大的Web应用程序。此外,PHP还支持RESTful API开发,以便构建能够与各种平台集成的Web服务。
作者其他创作
大纲/内容
如果脚本里只有php,后面的?>也可以不加加?>反而会有提示一般只有php的脚本,都不加?>
以<?php开头,以?>结尾
语句以;结尾
可以放在文档任何位置,文件扩展名为.phpphp脚本里可以放html css js,但php语句只能在php文件里运行
格式
能输出一个以上的字符串,英文逗号隔开
echo
一样
只能输出一个字符串,并始终返回1
print
echo比print稍快,并且开销低
输出
//
#
单行
/**/
多行
注释
$开头
字母或_开头
不用定义数据类型,php会根据值自动将变量转换为正确的数据类型
可以直接在html标签里用<?php $变量?>来插入一个已定义的变量
world这个值可以通过$$a访问,也可以用$hello
变量的变量在PHP中不是经常使用的特性,因为它可能导致代码难以理解和维护。但在某些情况下,特别是在处理动态属性名称或动态创建变量时,它们可以非常有用。
$a = 'hello';$$a = 'world';
$$
特殊声明方式
变量
define(\"CONSTANT_NAME\
define()
const CONSTANT_NAME = \"value\";
const
定义
echo CONSTANT_NAME;
echo CONSTANT_NAME. $variable;
常量+变量输出
获取当前环境中所有常量
这个是自己定义的常量
get_defined_constants(true)['user']
get_defined_constants()
不可变的值,具有全局作用域、区分大小写(默认情况下)的特性,并且一经设定就不能改变或重新定义。
文件中的当前行号
__LINE__
完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名
__FILE__
文件所在的目录
__DIR__
函数名
__FUNCTION__
类的名称
__CLASS__
类的方法名
__METHOD__
当前命名空间的名称
__NAMESPACE__
Trait(PHP 5.4.0 新增)的名字
__TRAIT__
魔术常量
常量
除了变量,其他所有包括(自定义函数,类和关键词)都对大小写不敏感
大小写敏感
代码中可以有空格、换行、tab,实际效果自己看
echo '<br>';
在终端会输出换行,但在浏览器中只是空格浏览器还是要用<br>换行
echo PHP_EOL;
换行
空白符
$input = readline(\"请输入内容:\");echo \"输入的内容是:\
echo\"请输入内容:\";$input = fgets(STDIN);echo\"您输入的内容是:\
输入
获取命令行输入
返回变量数据类型和值,一般用于开发调试
var_dump()
返回$a的数据类型
echo gettype($a)
查看数据类型
a的值是$a
$a = 'a123';echo 'a的值是$a';
‘’单引号直接输出引号里的内容
a的值是a123
$a = 'a123';echo \"a的值是$a\";
“”双引号会将其中的变量渲染出来
单引号和双引号
引号内的任何文本
字符串string
十进制,十六进制(0x前缀),八进制(0前缀)都可以
必须至少一个数字(0-9)
整数int
10.3656
2.4*10的3次方
2.4e3
8*10的-5次方
8e-5
带小数点的数字
浮点型float
true or false
逻辑
array(“”,“”,“”);
[“”,“”,“”];
$array1 = [];$array1[2] = \"3\";
开头定义空数组,然后赋值
默认的键是从0开始的数字,可以再任意位置插入自定义键值对
( [0] => 1 [1] => 2 [2] => 3 [key1] => key1 [3] => 4)
键值对
第一层(中国,日本,韩国),第二层(城市),第三层(人口,特色美食)
$cities = array( \"中国\" => array( \"北京\" => array( \"人口\" => \"2154万\
一般最多三四层
多维数组
foreach
遍历
数组
对象
可以通过给变量赋值为null来清空变量数据
null
resource资源类型
数据类型
<<<EOF开头,开头后面不能有空格EOF;结尾,结尾要单独一行并且顶头EOF可以用任意字符串代替,最好不要是常见的
echo <<< EOF<a href=\"index.php\">index</a><br>EOF;
中间的变量、html标签会被解析出来单双引号不需要转义双引号外的排列会被保留,双引号内的转译保留
用法
定界符Heredoc
算数
赋值
递增/递减
比较
$bool = true && false;先算逻辑再赋值
$bool = true and false;先赋值再算逻辑
&&(||)比and(or)优先级高
优先级
or前面的为true,就不会执行后面的语句,因为只要有一个为true就是true
and前面的为false,就不会执行后面的语句,因为必须两个都为true才能是ture
阻断效果
保留数组1的键值对,如果数组2中有重复的键,则忽略
数组1+数组2
特殊
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\";
例
condition ? expr1 : expr2
if-else的简写
三元
如果变量 $a 存在且不为 null,则 $result 被赋值为 $a 的值;否则,其值为 $b。
$result = $a ?? $b;
$result 将被赋值为 $a、$b、$c 中第一个存在且非 null 的值。如果这些变量都不存在或为 null,则 result 被赋值为 \"default\"。
$result = $a ?? $b ?? $c ?? \"default\";
??7之后的版本才有
空合并
a>b,c为1a==b,c为0a<b,c为-1
$c = $a <=> $b;
<=>
组合比较符
数据类型的比较
运算符
if (条件){ 执行的语句;}
if
if (条件){ 执行的语句;}else { 执行的语句;}
if else
if (条件){ 执行的语句;}elseif (条件){ 执行的语句;}else{ 执行的语句;}
if elseif else
这里只比较n和label的值,忽略数据类型
switch (n){ case label1: 如果n=label1,执行; break; case label2: 如果n=label2,执行; break; default: 如果上面都不满足,执行;}
switch
条件语句
初始值和增量可为空,或多个用,隔开
for (;条件;)前后为空但;要留着
for (初始值;条件;增量){ 执行的循环体;};
for
只要条件成立就一直循环
while (条件){ 执行语句;};
会至少执行一次代码,然后检查条件
do{ 执行的语句;};while(条件);
while
continue跳出这一次循环
break跳出整个循环
break n;从内向外数,跳出n个循环(循环一般不要嵌套超过3个)
在循环里加条件
continue和break
foreach ($array2 as $value) { echo $value; echo '<br>'; }; echo \"<br>\"; foreach ($array2 as $key => $value) { echo \"$key => $value\"; echo \"<br>\"; };
遍历数组
循环
用于打印关于变量的易读信息,特别是用于输出数组和对象的结构。
print_r()
$变量=1234567890.12345
number_format($变量,2)
删除$变量
unset($变量)
判断$变量是否存在
isset($变量)
is_null()
以下都返回ture:“”,空字符0,整数0nullfalsearray(),空数组
对于未定义的变量也返回true,所以用之前先保证变量已定义
empty()
输出数据类型
gettype()
四舍五入
round()
获取字符串长度
strlen()
查找,区分大小写,返回第一次出现位置或false
strpos()
同上,不区分大小写
stripos()
查找,区分大小写返回最后一次出现位置或false
strrpos()
strripos()
拆分字符串
explode()
拼接字符串
implode()
转大写
strtoupper()
转小写
strtolower()
首字母大写
ucfirst()
首字母小写
lcfirst()
字符串中每个单词的首字母大写
ucwords()
在$string里找$search,然后换成$replace
字符串反转
strrev()
去除两端空格
trim()
截取英文字符串de第2到3索引
需要安装mbstring扩展
同上,截取中文字符串
mb_substr()
字符串相关函数
创建数组
array()
计算数组中的元素个数或对象中的属性个数
count()
元素添至末尾
元素添至开头
删除并返回最后一个元素
array_pop()
删除并返回第一个元素
array_shift()
提取一部分,组成新数组
font color=\"#e74f4c\
数组相加,键值对取最新的键与数组+数组更新方式相反
arrary_merge()
反转元素顺序
array_reverse()
检测是否存在某个值
is_array(值,$array)
检查是否存在某个键
array_key_exists(键名,$array)
(数组,值<可选>,是否严格<默认false>)
返回所有键,组成新数组
array_keys()
返回所有值,组成新数组
array_values()
搜索给定值,返回对应键
array_search(值,键)
移除重复值,返回新数组,原数组不变
array_unique()
最大最小值
max(),min()
升序
sort()
降序
rsort()
只能算数字
求和
array_sum()
求积
array_product()
数组相关函数
当前时间戳(10位)
time()
调用 microtime(true) 返回一个浮点数,表示当前时间
当前时间戳和微秒数
microtime(true)
返回本地服务器的时区
日期格式化
date(格式,时间戳)
可以加一个基础日期,(‘+1 day’,$base_time)
字符串变成时间戳输出下周一的时间戳
strtotime(“next Monday”)
生成时间戳,要格式化的时间要重新转换
创建日期
date_create()
格式化成指定字符串格式
date_format()
计算时间差
date_diff()
时间戳格式化为可读,php8已废弃
返回格林威治标准时间(GMT)
只能在脚本开始时设置,不能在运行时动态设置
设置默认时区
date_default_timezone_set($timezone)
返回所有timezone
timezone_identifiers_list()
日后再看
DateTIme对象
时间日期
内置函数
function funcName($参数){}不用加分号,分号的作用是作为语句的解暑符,而函数定义本身就是一个完整的结构
function funcName($参数){}
非严格模式下,不同数据类型的参数会自动转换
规定参数数据类型
<?php declare(strict_types= 1);?><a href=\"index.php\
严格模式下,非规定类型的参数会报错
严格模式declare(strict_types= 1);在一个php文件中,严格模式的声明必须首句
function funcName(int $参数){}
参数
return
返回值
在函数内部使用全局变量
$GLOBALS 是一个超级全局变量数组,它存储了所有PHP脚本中定义的全局变量。通过使用 $GLOBALS 数组,您可以在一个PHP脚本中访问在另一个脚本中定义的全局变量。这使得在不同脚本间共享数据变得相对容易。
$GLOBALS
https://m.runoob.com/php/php-superglobals.html
$_SERVER
超级全局变量
global
000
function static_func(){ $a = 0; echo $a; $a++; echo \"<br>\";}static_func();static_func();static_func();
012
function static_func(){ static $a = 0; echo $a; $a++; echo \"<br>\";}static_func();static_func();static_func();
函数调用结束后,局部变量都会被删除static可以保留局部变量前一次被调用的值
static
作用域
创建
自定义
函数
如果要包含的文件不存在,会发出警告(E_WARNING),但脚本会继续执行。
include './somefile.php';
比如被包含的文件里声明了一个函数,如果多次include,相当于声明了多次
只执行一次
include_once
include
相当于把被包含的文件里所有代码复制粘贴过来
如果要包含的文件不存在,会发出致命错误(E_COMPILE_ERROR),并停止脚本的执行。
require 'somefile.php';
require_once
require(用法和include完全一样)
包含
class 类名{}
定义类
$变量 = new 类名;实例化
echo $变量->name;类属性echo $变量->eat();类方法
调用
public $name = '猫咪';public function eat(){}
$this->name
在类里调用自身的属性
$this
类方法和属性
class MyClass { const CONSTANT = 'constant value'; public function showConstant() { echo self::CONSTANT; }}echo MyClass::CONSTANT; // 输出 'constant value'
不可变性:一旦定义,常量的值就不能更改。全局可访问性:可以在类的外部通过类名访问。作用域:常量是属于类本身的,而不是属于类的实例。
类常量
公有的类成员,可以在任何地方被访问
public
私有,只能被定义所在的类访问
private
收保护的,可以被自身、其子类访问
protected
类的访问控制
class MyClass { public function __construct($param) { echo \"构造函数被调用,参数值为: $param<br>\"; }}$obj = new MyClass(\"Hello\");
构造函数在每次创建类的新实例时自动调用。通常用于初始化对象的属性或执行一些类实例化时的启动任务。类似Python类的__init__
__construct
构造函数
class MyClass { public function __destruct() { echo \"析构函数被调用<br>\"; }}$obj = new MyClass();unset($obj); // 显示调用析构函数
析构函数在对象不再被使用时自动调用,即当对象被销毁时。通常用于执行清理工作,如关闭文件、释放资源等。当对象不再被调用或脚本执行结束时,会被自动调用。一般用不上
__destruct
析构函数
class MyClass { public static $staticVar = \"I am static\"; public function displayStaticVar() { return self::$staticVar; // 访问静态变量 }}echo MyClass::$staticVar; // 直接通过类名访问
没有实例化(创建类对象),也可以访问类的静态属性(静态变量)
静态变量
class MyClass { public static function myStaticMethod() { echo \"静态方法\"; }}// 直接调用静态方法,不需要实例化 MyClassMyClass::myStaticMethod();
可以通过类名直接调用,不需要类的实例。
class MyClass { public static $staticVar = \"静态属性\"; public static function anotherStaticMethod() { echo \" 另一个静态方法\"; } public static function staticMethod() { echo \"静态方法调用 \" . self::$staticVar; // 访问静态属性 self::anotherStaticMethod(); // 调用另一个静态方法 } }MyClass::staticMethod();
调用静态属性、静态方法
也可以直接用(new self())->非静态属性(方法)
self不加()也能被解析出来,但加()严谨一些
class MyClass { public $nonStaticVar = \"非静态属性\"; public function nonStaticMethod() { echo \"非静态方法\"; } public static function staticMethod() { $instance = new self(); // 创建类的实例 echo $instance->nonStaticVar; // 访问非静态属性 $instance->nonStaticMethod(); // 调用非静态方法 }}MyClass::staticMethod();
调用非静态属性、非静态方法
静态方法
Cannot access protected property Cat::$name
class Animal{ protected $name = \"animal\";}class Cat extends Animal{}$cat = new Cat();$cat->name;
在子类里声明一个调用父类protected的方法
class Cat extends Animal{ public function getName(){ echo $this->name; }}
父类的protected属性可以在子类内部访问但不能单纯地通过实例化子类访问父类的protected
父类的private属性无法访问
父类的属性
class ParentClass { public function display() { echo \"这是父类的方法<br>\"; }}class ChildClass extends ParentClass { public function display() { parent::display(); // 调用父类的方法 echo \"这是子类的方法<br>\"; }}$child = new ChildClass();$child->display();
parent::
父类的方法
class 子类 extends 父类{}
禁止类、类方法被继承无法作用于类属性
final
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\"
在面向对象编程中,当子类继承父类时,如果在父类的静态方法中使用 self 关键字,self 将总是引用原始类(即定义该方法的类),而不是运行时的类。
问题场景
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\"
现在,static::getName() 会根据运行时的类来解析
引入static关键字
静态延迟绑定 static
extends
在PHP中,\"重载\
没太懂
重载
继承
实现多态的两种主要方式:继承(Inheritance):子类继承父类,并重写(Override)父类的方法。在这种情况下,即使子类对象被视为父类类型,它仍然可以调用重写的方法,从而展现出不同的行为。接口(Interface):不同的类实现同一个接口。这些类可以有不同的行为实现,但都遵循相同的方法签名,这允许你以统一的方式处理这些不同的对象。
多态性允许不同类的对象对相同的消息作出不同的响应。多态性通过方法重写(覆盖)和方法重载来实现。方法重写是指子类重写父类的方法,以改变方法的实现细节。方法重载是指在同一个类中根据参数个数或类型不同来实现不同功能。需要注意的是,多态性只适用于继承关系的类。子类必须重写父类的方法才能实现多态性。多态是面向对象编程中的一个核心概念,它指的是同一个方法或属性在不同的类实例中可以有不同的实现。在PHP中,多态主要是通过继承和接口来实现的,它允许你使用统一的接口来处理不同的类实例,这些类实例实现了相同的方法或属性,但各自有不同的行为。
多态
interface MyInterface { const CONSTANT = 'SomeValue'; //常量 public function method1(); //方法 function method2(); // 默认public}
class Cat implements MyInterface{ public function a(){ }; public function b(){ };}
接口里的方法,在implements的类里一定要提供其实现接口中定义的常量,可以在类中直接使用,但不能被重写或取消定义。
定义一组方法,但不提供这些方法的具体实现。接口是一种确保某些类包含特定方法的方式,它定义了类的行为规范,但将具体的实现留给了类本身。
接口interface
abstract class Animals{ }
抽象类是一种特殊的类,只能被继承,不能被实例化抽象类用于定义一组相关的方法,但这些方法的具体实现由继承它的子类来完成。子类继承抽象类后,必须实现抽象类中的所有抽象方法。抽象类可以包含抽象方法和普通方法的实现
抽象类
abstract public function xxx(); abstract protected function xxx();
抽象方法是没有具体实现的方法,只有方法的声明,而不需要方法体。抽象方法只能存在于抽象类中。可以使用protected,但不能使用private私有。
抽象方法
抽象类和抽象方法abstract
1. 抽象类可以包含非抽象方法的实现,而接口只能包含方法的声明,没有方法的实现。2. 类只能继承一个抽象类,但可以实现多个接口。3. 抽象类可以有构造函数,而接口不能有构造函数。4. 抽象类中的方法可以有public、protected和private访问修饰符,而接口中的方法只能是public。5. 子类继承抽象类时,必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。子类实现接口时,必须实现接口中的所有方法。
抽象类与接口的区别
trait MyTrait { public function myFunction() { echo \"Hello from MyTrait\"; }}
class MyClass { use MyTrait;}$obj = new MyClass();$obj->myFunction(); // 输出 \"Hello from MyTrait\"
trait中可使用抽象方法trait中可使用静态属性和静态方法trait中可使用其他traittrait中可使用parent
解决类的单一继承问题可同时使用多个trait,用逗号隔开把常用的、通用的代码抽离出来,写成traittrait里面不能有类常量,且trait不能被实例化。
当一个类同时引入了多个Trait,并且这些Trait中存在同名方法时,就会产生方法冲突不能解决同名属性冲突,要避免同名属性
同名冲突
trait
面向对象
基础语法
PHP
0 条评论
回复 删除
下一页