한 기사에서는 PHP5-8 각 버전의 기능을 자세히 설명합니다. [요약]
이 글은 모든 사람을 위한 PHP5-8의 각 버전의 기능을 요약하고 있습니다. 필요하다면 읽고, 수집하고, 읽는 것이 모든 사람에게 도움이 되기를 바랍니다.
PHP5-8
PHP5.1 각 버전의 기능 요약:
- autoload
- PDO
- MySQLi
- 유형 제약 조건
PHP5.2:
- JSON 지원
PHP5.3:
- Namespace
- 익명 함수
- Closure
- 새로운 매직 메소드
__callStatic()
및__invoke()
__callStatic()
和__invoke()
- 新增魔术变量
__DIR__
- 动态调用静态方法
- 延迟静态绑定
- Heredoc和 Nowdoc
- 类外使用const定义常量
- 三元运算符
- Phar
PHP5.4:
- Short Open Tag
- 数组简写
- Traits,
- 内置 Web 服务器
- 动态访问静态方法
- 实例化时访问类成员
PHP5.5:
- yield
- list用于foreach
- 细节修改
PHP5.6:
- 常量增强
- 命名空间增强
- 可变函数参数
PHP7.0:
- 标量类型声明
- 返回值类型声明
- defined定义常量数组
- 匿名类
- null合并运算符
PHP7.1:
- 可为空类型
- void类型
- 多异常捕获
PHP7.2:
- 新的对象object
- 允许重写抽象方法
PHP7.3:语法层面没有很大的改变
PHP7.4:
- 类型属性
- 箭头函数
- Null合并运算符支持方法
- Opcache 预加载
PHP8.0:
- JIT即时编译
- 命名参数
- 注解
- 联合类型
- Match表达式
- Nullsafe 运算符
- 构造器属性提升
PHP5.1
__autoload()魔术方法
这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。可以通过定义这个函数来启用类的自动加载。
function __autoload($className) { $filePath = “project/class/{$className}.php”; if (is_readable($filePath)) { require($filePath); //这里可以只用require,因为一旦包含进来后,php引擎再遇到类A时,将不会调用__autoload,而是直接使用内存中的类A,不会导致多次包含。 } } $a = new A(); $b = new B(); $c = new C();
PDO
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
安装
可以通过 PHP 的 phpinfo() 函数来查看是否安装了PDO扩展。
//Linux extension=pdo.so //Windows extension=php_pdo.dll
使用
<?php $dbms='mysql'; //数据库类型 $host='localhost'; //数据库主机名 $dbName='test'; //使用的数据库 $user='root'; //数据库连接用户名 $pass=''; //对应的密码 $dsn="$dbms:host=$host;dbname=$dbName"; try { $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象 echo "连接成功<br/>"; /*你还可以进行一次搜索操作 foreach ($dbh->query('SELECT * from FOO') as $row) { print_r($row); //你可以用 echo($GLOBAL); 来看到这些值 } */ $dbh = null; } catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "<br/>"); } //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样: $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
MySQLi
mysqli.dll是PHP对mysql新特性的一个扩展支持,允许访问MySQL 4.1及以上版本提供的功能。
mysql与mysqli的区别:
mysqli连接是永久连接,而mysql是非永久连接。
mysql连接每当第二次使用的时候,都会重新打开一个新的进程。mysqli连接一直都只使用同一个进程。
使用
$conn = mysqli_connect('localhost', 'root', '123', 'db_test') or ('error'); $sql = "select * from db_table"; $query = mysqli_query($conn,$sql); while($row = mysqli_fetch_array($query)){ echo $row['title']; }
类型约束
通过类型约束可以限制参数的类型,不过这一机制并不完善,目前仅适用于类和 callable(可执行类型) 以及 array(数组), 不适用于 string 和 int.
// 限制第一个参数为 MyClass, 第二个参数为可执行类型,第三个参数为数组 function MyFunction(MyClass $a, callable $b, array $c) { // ... }
PHP5.2
JSON
- json_encode — 对变量进行 JSON 编码
- json_decode — 对 JSON 格式的字符串进行解码
PHP5.3
命名空间
避免不同包中的类名或变量名产生冲突
<?php namespace XXX; // 命名空间的分隔符是反斜杠,该声明语句必须在文件第一行。
匿名函数(闭包)
用来临时性地创建一个无名函数,用于回调函数等用途。
$func = function($arg) { print $arg; }; $func("Hello World! hovertree.top");
新增魔术方法__callStatic()
和__invoke()
__callStatic()
:用静态方式中调用一个不可访问方法时调用
__invoke()
__DIR__
🎜🎜정적 메소드에 대한 동적 호출🎜🎜지연된 정적 바인딩🎜🎜Heredoc 및 Nowdoc🎜🎜const를 사용하여 클래스 외부에서 상수 정의🎜🎜3차 연산자🎜🎜Phar🎜🎜🎜PHP5.4:🎜🎜🎜Short Open 태그🎜🎜배열 약어🎜🎜Traits,🎜🎜내장 웹 서버🎜🎜정적 메서드에 대한 동적 액세스🎜🎜인스턴스화 중 클래스 멤버에 액세스🎜🎜🎜PHP5.5:🎜🎜🎜yield🎜🎜foreach에 대한 목록🎜 🎜세부사항 수정 🎜🎜🎜PHP5.6:🎜🎜🎜지속적인 향상🎜🎜네임스페이스 향상🎜🎜가변 함수 매개변수🎜🎜🎜PHP7.0:🎜🎜🎜스칼라 유형 선언🎜🎜반환 값 유형 선언🎜🎜정의된 정의 상수 배열🎜 🎜 익명 수업 🎜🎜null 병합 연산자🎜🎜🎜PHP7.1: 🎜🎜🎜nullable 유형🎜🎜void 유형🎜🎜다중 예외 잡기🎜🎜🎜PHP7.2: 🎜🎜🎜새 개체 개체🎜🎜를 사용하면 추상 메서드 재정의가 가능합니다. 🎜🎜🎜PHP7. 3: 구문 수준에는 큰 변화가 없습니다🎜🎜PHP7.4: 🎜🎜🎜Type 속성 🎜🎜화살표 함수 🎜🎜Null 병합 연산자 지원 방법 🎜🎜Opcache 사전 로드 🎜🎜🎜PHP8.0 :🎜🎜🎜JIT 그냥- 시간 내 컴파일🎜🎜이름이 지정된 매개변수🎜🎜Annotations🎜🎜Union 유형🎜🎜일치 표현식🎜🎜Nullsafe 연산자🎜🎜생성자 속성 승격🎜🎜PHP5.1🎜
__autoload() 매직 메소드
이것은 PHP5에서 자동 로딩 함수입니다. 이 함수는 정의되지 않은 경우 실행됩니다. 클래스가 인스턴스화됩니다. 이 함수를 정의하면 클래스의 자동 로딩을 활성화할 수 있습니다.
$person = new Person('小明'); // 初始赋值
$person(); //触发__invoke()
로그인 후 복사🎜🎜PHP의 __autoload() 매직 메소드에 대한 자세한 설명🎜🎜🎜PDO
PDO(PHP 데이터 개체) 확장은 PHP를 위한 쉬운 방법을 정의합니다. 데이터베이스에 액세스하려면 규모의 일관된 인터페이스를 사용하세요.
설치
🎜PDO 확장 프로그램이 설치되었는지는 PHP의 phpinfo() 함수를 통해 확인할 수 있습니다. 🎜public static function test($userName)
{
//...
}
$className = 'cls';
$className::test('Tom'); // PHP >= 5.3.0
로그인 후 복사
사용
class A
{
static public function callFuncXXOO()
{
print self::funcXXOO();
}
static public function funcXXOO()
{
return "A::funcXXOO()";
}
}
class B extends A
{
static public function funcXXOO()
{
return "B::funcXXOO";
}
}
$b = new B;
$b->callFuncXXOO(); //A::funcXXOO()
로그인 후 복사로그인 후 복사
🎜🎜PHP PDO🎜🎜🎜MySQLi
mysqli.dll은 mysql을 위한 PHP의 새로운 기능입니다. MySQL 4.1 이상에서 제공되는 기능에 대한 액세스를 허용하는 확장 지원입니다.
mysql과 mysqli의 차이점:
🎜🎜mysqli 연결은 영구적인 연결이지만, mysql은 비영구 연결입니다. 🎜🎜🎜🎜MySQL 연결은 두 번째 사용될 때마다 새로운 프로세스를 다시 엽니다. Mysqli 연결은 항상 동일한 프로세스를 사용합니다. 🎜🎜🎜사용
class A
{
static public function callFuncXXOO()
{
print static::funcXXOO();
}
// ...
}
B::callFuncXXOO(); //B::funcXXOO()
로그인 후 복사로그인 후 복사
🎜🎜mysqli와 mysql의 차이점은 무엇입니까🎜🎜🎜유형 제약 조건 Strong>
🎜 매개변수 유형은 유형 제약을 통해 제한될 수 있습니다. 그러나 이 메커니즘은 현재 클래스, 호출 가능 항목(실행 가능 유형) 및 배열(배열)에만 적용됩니다. 문자열 및 정수에는 적용되지 않습니다.🎜
<?php
$favoriteColor = $_GET["color"] ?: "pink";
로그인 후 복사로그인 후 복사PHP5.2🎜
JSON
🎜🎜json_encode — 변수의 JSON 인코딩🎜🎜json_decode — JSON 형식 문자열 디코드🎜🎜PHP5.3🎜< hr/>네임스페이스
다른 패키지의 클래스 이름이나 변수 이름 간의 충돌 방지
$phar = new Phar('swoole.phar');
$phar->buildFromDirectory(__DIR__.'/../', '/.php$/');
$phar->compressFiles(Phar::GZ);
$phar->stopBuffering();
$phar->setStub($phar->createDefaultStub('lib_config.php'));
로그인 후 복사로그인 후 복사
익명 함수(클로저)
콜백 함수 및 기타 목적을 위해 이름 없는 함수를 임시로 생성하는 데 사용됩니다.
include 'swoole.phar';
include 'swoole.phar/code/page.php';
로그인 후 복사로그인 후 복사
새로운 매직 메소드 __callStatic()
및 __invoke()
🎜__callStatic( )
: 정적 모드에서 접근할 수 없는 메서드를 호출할 때 호출됩니다🎜🎜__invoke()
: 함수를 호출하여 객체를 호출할 때의 응답 메서드🎜$person = new Person('小明'); // 初始赋值
$person(); //触发__invoke()
로그인 후 복사
新增魔术变量__DIR__
获取当前执行的PHP脚本所在的目录
如当前执行的PHP文件为 /htdocs/index.php,则__FILE__
等于’/htdocs/index.php’,而__DIR__
等于’/htdocs’。
动态调用静态方法
public static function test($userName)
{
//...
}
$className = 'cls';
$className::test('Tom'); // PHP >= 5.3.0
로그인 후 복사
延迟静态绑定
PHP 5.3.0中增加了一个static关键字来引用当前类,即实现了延迟静态绑定。
这是因为 self 的语义本来就是“当前类”,所以 PHP5.3 给 static 关键字赋予了一个新功能:后期静态绑定
class A
{
static public function callFuncXXOO()
{
print self::funcXXOO();
}
static public function funcXXOO()
{
return "A::funcXXOO()";
}
}
class B extends A
{
static public function funcXXOO()
{
return "B::funcXXOO";
}
}
$b = new B;
$b->callFuncXXOO(); //A::funcXXOO()
로그인 후 복사로그인 후 복사
class A
{
static public function callFuncXXOO()
{
print static::funcXXOO();
}
// ...
}
B::callFuncXXOO(); //B::funcXXOO()
로그인 후 복사로그인 후 복사
类外使用const定义常量
常量是一个简单的标识符。在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量)。常量默认大小写敏感。通常常量标识符总是大写的。
可以用define()函数来定义常量。在php5.3.0以后,可以使用const关键字在类定义的外部定义常量,先前版本const关键字只能在类(class)中使用。一个常量一旦被定义,就不能再改变或取消定义。
const和define的区别?
const是一个语言结构,而define是一个函数。const在编译时要比define快很多。
const用于类成员变量的定义,一经定义,不可修改。Define不可以用于类成员变量的定义,可用于全局常量。
Const可在类中使用,define不能
Const不能在条件语句中定义常量
const采用普通的常量名称,define可以采用表达式作为名称
const只能接受静态的标量,而define可以采用任何表达式
const定义的常量时大小写敏感,而define可以通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。
简化三元运算符
从PHP 5.3开始,通过排除中间表达式,甚至可以进一步简化三元语句。 如果测试表达式在布尔上下文中评估为true,则返回其值。 否则,将返回替代方法。
<?php
$favoriteColor = $_GET["color"] ?: "pink";
로그인 후 복사로그인 후 복사Phar
PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。
创建一个phar压缩包
$phar = new Phar('swoole.phar');
$phar->buildFromDirectory(__DIR__.'/../', '/.php$/');
$phar->compressFiles(Phar::GZ);
$phar->stopBuffering();
$phar->setStub($phar->createDefaultStub('lib_config.php'));
로그인 후 복사로그인 후 복사
使用phar压缩包
include 'swoole.phar';
include 'swoole.phar/code/page.php';
로그인 후 복사로그인 후 복사
使用phar可以很方便的打包你的代码,集成部署到线上机器。
PHP5.4
Short Open Tag 短开放标签
自 PHP5.4 起总是可用。
//可以把
<?php echo $xxoo;?>
//简写成:
<?= $xxoo;?>
로그인 후 복사
数组简写
// 原来的数组写法
$arr = array("key" => "value", "key2" => "value2");
// 简写形式
$arr = ["key" => "value", "key2" => "value2"];
로그인 후 복사
Traits
Traits是 PHP 多重继承的一种解决方案。PHP中无法进行多重继承,但一个类可以包含多个Traits
// Traits不能被单独实例化,只能被类所包含
trait SayWorld
{
public function sayHello()
{
echo 'World!';
}
}
class MyHelloWorld
{
// 将SayWorld中的成员包含进来
use SayWorld;
}
$xxoo = new MyHelloWorld();
// sayHello() 函数是来自 SayWorld 构件的
$xxoo->sayHello();
로그인 후 복사
优先级
基类中的成员函数将被Traits中的函数覆盖,当前类中的成员函数将覆盖Traits中的函数。
内置 Web 服务器
PHP从5.4开始内置一个轻量级的Web服务器,不支持并发,定位是用于开发和调试环境。
在开发环境使用它的确非常方便。
php -S localhost:8000
로그인 후 복사
动态访问静态方法
$func = "funcXXOO";
A::{$func}();
로그인 후 복사
实例化时访问类成员
(new MyClass)->xxoo();
로그인 후 복사
PHP5.5
yield关键字
yield关键字用于当函数需要返回一个迭代器的时候,逐个返回值。
function number10()
{
for($i = 1; $i <= 10; $i += 1)
yield $i;
}
로그인 후 복사list() 用于 foreach
$array = [
[1, 2, 3],
[4, 5, 6],
];
foreach ($array as list($a, $b, $c))
echo "{$a} {$b} {$c}\n";
로그인 후 복사细节修改
- 不推荐使用 mysql 函数,推荐使用 PDO 或 MySQLi
- 不再支持Windows XP.
- 可用 MyClass::class 取到一个类的完整限定名(包括命名空间)
- empty() 支持表达式作为参数
- try-catch 结构新增 finally 块
PHP5.6
常量增强
定义常量时允许使用之前定义的常量进行计算
const A = 2;
const B = A + 1;
로그인 후 복사允许常量作为函数参数默认值
function func($arg = C::STR2)asdf
로그인 후 복사
可变函数参数
用于代替 func_get_args()
function add(...$args)
{
//...
}
로그인 후 복사同时可以在调用函数时,把数组展开为函数参数:
$arr = [2, 3];
add(1, ...$arr);
로그인 후 복사命名空间增强
命名空间支持常量和函数
PHP7.0
标量类型声明
四种标量类型:boolean (布尔型),integer (整型),float (浮点型, 也称作 double),string (字符串)
function typeString(string $a)
{
echo $a;
}
typeString('sad'); //sad
로그인 후 복사返回值类型声明
function returnErrorArray(): array
{
return '1456546';
}
print_r(returnErrorArray());
/*
Array
Fatal error: Uncaught TypeError: Return value of returnArray() must be of the type array, string returned in
*/
로그인 후 복사define 定义数组
define('ANIMALS', [
'dog',
'cat',
'bird'
]);
echo ANIMALS[1]; // 输出 "cat"
로그인 후 복사匿名类
匿名类就像一个没有事先定义的类,而在定义的时候直接就进行了实例化。
// 直接定义
$objA = new class{
public function getName(){
echo "I'm objA";
}
};
$objA->getName();
로그인 후 복사
null 合并运算符
$username = $_GET['user'] ?? 'nobody';
//这两个是等效的 当不存在user 则返回?? 后面的参数
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
로그인 후 복사
PHP7.1
可为空类型
参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。
当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。
<?php
function testReturn(): ?string{
return 'elePHPant';
}
로그인 후 복사void类型
<?php
function swap(&$left, &$right) : void{
//...
}
로그인 후 복사多异常捕获
<?php
try {
// some code
} catch (FirstException | SecondException $e) {
// ...
}
로그인 후 복사PHP7.2
新的对象类型object
<?php
function test(object $obj) : object
{
return new SplQueue();
}
test(new StdClass());
로그인 후 복사允许重写抽象方法
当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。
<?php
abstract class A
{
abstract function test(string $s);
}
abstract class B extends A
{
// overridden - still maintaining contravariance for parameters and covariance for return
abstract function test($s) : int;
}
로그인 후 복사PHP7.4
类属性支持类型声明
<?php
class User {
public int $id;
public string $name;
}
로그인 후 복사箭头函数
使用隐式按值作用域绑定定义函数的简写语法。
<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);?>
로그인 후 복사
Null 合并运算符支持方法
<?php
$array['key'] ??= computeDefault();
//if (!isset($array['key'])) {$array['key'] = computeDefault();}
?>
로그인 후 복사
Opcache 预加载
Opcache将获取您的PHP源文件,将其编译为“ opcodes”,然后将这些编译后的文件存储在磁盘上。opcache会跳过源文件和PHP解释器在运行时实际需要之间的转换步骤。
PHP8.0
JIT即时编译
PHP8的JIT目前是在Opcache之中提供的
JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码
JIT不是原来Opcache优化的替代,是增强
目前PHP8只支持x86架构的CPU
命名参数
就是具名参数,在调用函数的时候,可以指定参数名称,指定参数名称后,参数顺序可以不安装原函数参数顺序传
//传统方式调用
balance(100, 20);
//php8 使用命名参数调用
balance(amount: 100, payment: 20);
로그인 후 복사
注解
使用注解可以将类定义成一个一个低解耦,高内聚的元数据类。在使用的时候通过注解灵活引入,反射注解类实例的时候达到调用的目的。
注解类只有在被实例化的时候才会调用
联合类型
在不确定参数类型的场景下,可以使用
function printSomeThing(string|int $value)
{
var_dump($value);
}
로그인 후 복사
Match表达式
和switch cash差不多,不过是严格===匹配
<?php
$key = 'b';
$str = match($key) {
'a' => 'this a',
'c' => 'this c',
0 => 'this 0',
'b' => 'last b',
};
echo $str;//输出 last b
로그인 후 복사
Nullsafe 运算符
//不实例 User 类,设置为null
$user = null;
echo $user->getName();//php8之前调用,报错
echo $user?->getName();//php8调用,不报错,返回空
로그인 후 복사
构造器属性提升
在构造函数中可以声明类属性的修饰词作用域
<?php
// php8之前
class User
{
protected string $name;
protected int $age;
public function __construct(string $name, int $age)
{
$this->name = $name;
$this->age = $age;
}
}
//php8写法,
class User
{
public function __construct(
protected string $name,
protected int $age
) {}
}
로그인 후 복사
推荐学习:《PHP视频教程》
위 내용은 한 기사에서는 PHP5-8 각 버전의 기능을 자세히 설명합니다. [요약]의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
$person = new Person('小明'); // 初始赋值 $person(); //触发__invoke()
PDO
PDO(PHP 데이터 개체) 확장은 PHP를 위한 쉬운 방법을 정의합니다. 데이터베이스에 액세스하려면 규모의 일관된 인터페이스를 사용하세요.
설치
🎜PDO 확장 프로그램이 설치되었는지는 PHP의 phpinfo() 함수를 통해 확인할 수 있습니다. 🎜public static function test($userName) { //... } $className = 'cls'; $className::test('Tom'); // PHP >= 5.3.0
사용
class A { static public function callFuncXXOO() { print self::funcXXOO(); } static public function funcXXOO() { return "A::funcXXOO()"; } } class B extends A { static public function funcXXOO() { return "B::funcXXOO"; } } $b = new B; $b->callFuncXXOO(); //A::funcXXOO()
- 🎜🎜PHP PDO🎜🎜🎜
MySQLi
mysqli.dll은 mysql을 위한 PHP의 새로운 기능입니다. MySQL 4.1 이상에서 제공되는 기능에 대한 액세스를 허용하는 확장 지원입니다.
mysql과 mysqli의 차이점:
- 🎜🎜mysqli 연결은 영구적인 연결이지만, mysql은 비영구 연결입니다. 🎜🎜🎜🎜MySQL 연결은 두 번째 사용될 때마다 새로운 프로세스를 다시 엽니다. Mysqli 연결은 항상 동일한 프로세스를 사용합니다. 🎜🎜🎜
사용
class A { static public function callFuncXXOO() { print static::funcXXOO(); } // ... } B::callFuncXXOO(); //B::funcXXOO()
- 🎜🎜mysqli와 mysql의 차이점은 무엇입니까🎜🎜🎜
유형 제약 조건 Strong>
🎜 매개변수 유형은 유형 제약을 통해 제한될 수 있습니다. 그러나 이 메커니즘은 현재 클래스, 호출 가능 항목(실행 가능 유형) 및 배열(배열)에만 적용됩니다. 문자열 및 정수에는 적용되지 않습니다.🎜<?php $favoriteColor = $_GET["color"] ?: "pink";
PHP5.2🎜
JSON
🎜🎜json_encode — 변수의 JSON 인코딩🎜🎜json_decode — JSON 형식 문자열 디코드🎜🎜PHP5.3🎜< hr/>네임스페이스
다른 패키지의 클래스 이름이나 변수 이름 간의 충돌 방지
$phar = new Phar('swoole.phar');
$phar->buildFromDirectory(__DIR__.'/../', '/.php$/');
$phar->compressFiles(Phar::GZ);
$phar->stopBuffering();
$phar->setStub($phar->createDefaultStub('lib_config.php'));
로그인 후 복사로그인 후 복사
익명 함수(클로저)
콜백 함수 및 기타 목적을 위해 이름 없는 함수를 임시로 생성하는 데 사용됩니다.
include 'swoole.phar';
include 'swoole.phar/code/page.php';
로그인 후 복사로그인 후 복사
새로운 매직 메소드 __callStatic()
및 __invoke()
🎜__callStatic( )
: 정적 모드에서 접근할 수 없는 메서드를 호출할 때 호출됩니다🎜🎜__invoke()
: 함수를 호출하여 객체를 호출할 때의 응답 메서드🎜$person = new Person('小明'); // 初始赋值
$person(); //触发__invoke()
로그인 후 복사
新增魔术变量__DIR__
获取当前执行的PHP脚本所在的目录
네임스페이스
다른 패키지의 클래스 이름이나 변수 이름 간의 충돌 방지
$phar = new Phar('swoole.phar'); $phar->buildFromDirectory(__DIR__.'/../', '/.php$/'); $phar->compressFiles(Phar::GZ); $phar->stopBuffering(); $phar->setStub($phar->createDefaultStub('lib_config.php'));
익명 함수(클로저)
콜백 함수 및 기타 목적을 위해 이름 없는 함수를 임시로 생성하는 데 사용됩니다.
include 'swoole.phar'; include 'swoole.phar/code/page.php';
새로운 매직 메소드 __callStatic()
및 __invoke()
🎜__callStatic( )
: 정적 모드에서 접근할 수 없는 메서드를 호출할 때 호출됩니다🎜🎜__invoke()
: 함수를 호출하여 객체를 호출할 때의 응답 메서드🎜$person = new Person('小明'); // 初始赋值 $person(); //触发__invoke()
新增魔术变量__DIR__
获取当前执行的PHP脚本所在的目录
如当前执行的PHP文件为 /htdocs/index.php,则__FILE__
等于’/htdocs/index.php’,而__DIR__
等于’/htdocs’。
动态调用静态方法
public static function test($userName) { //... } $className = 'cls'; $className::test('Tom'); // PHP >= 5.3.0
延迟静态绑定
PHP 5.3.0中增加了一个static关键字来引用当前类,即实现了延迟静态绑定。
这是因为 self 的语义本来就是“当前类”,所以 PHP5.3 给 static 关键字赋予了一个新功能:后期静态绑定
class A { static public function callFuncXXOO() { print self::funcXXOO(); } static public function funcXXOO() { return "A::funcXXOO()"; } } class B extends A { static public function funcXXOO() { return "B::funcXXOO"; } } $b = new B; $b->callFuncXXOO(); //A::funcXXOO()
class A { static public function callFuncXXOO() { print static::funcXXOO(); } // ... } B::callFuncXXOO(); //B::funcXXOO()
类外使用const定义常量
常量是一个简单的标识符。在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量)。常量默认大小写敏感。通常常量标识符总是大写的。
可以用define()函数来定义常量。在php5.3.0以后,可以使用const关键字在类定义的外部定义常量,先前版本const关键字只能在类(class)中使用。一个常量一旦被定义,就不能再改变或取消定义。
const和define的区别?
const是一个语言结构,而define是一个函数。const在编译时要比define快很多。
const用于类成员变量的定义,一经定义,不可修改。Define不可以用于类成员变量的定义,可用于全局常量。
Const可在类中使用,define不能
Const不能在条件语句中定义常量
const采用普通的常量名称,define可以采用表达式作为名称
const只能接受静态的标量,而define可以采用任何表达式
const定义的常量时大小写敏感,而define可以通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。
简化三元运算符
从PHP 5.3开始,通过排除中间表达式,甚至可以进一步简化三元语句。 如果测试表达式在布尔上下文中评估为true,则返回其值。 否则,将返回替代方法。
<?php $favoriteColor = $_GET["color"] ?: "pink";
Phar
PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。
创建一个phar压缩包
$phar = new Phar('swoole.phar'); $phar->buildFromDirectory(__DIR__.'/../', '/.php$/'); $phar->compressFiles(Phar::GZ); $phar->stopBuffering(); $phar->setStub($phar->createDefaultStub('lib_config.php'));
使用phar压缩包
include 'swoole.phar'; include 'swoole.phar/code/page.php';
使用phar可以很方便的打包你的代码,集成部署到线上机器。
PHP5.4
Short Open Tag 短开放标签
自 PHP5.4 起总是可用。
//可以把 <?php echo $xxoo;?> //简写成: <?= $xxoo;?>
数组简写
// 原来的数组写法 $arr = array("key" => "value", "key2" => "value2"); // 简写形式 $arr = ["key" => "value", "key2" => "value2"];
Traits
Traits是 PHP 多重继承的一种解决方案。PHP中无法进行多重继承,但一个类可以包含多个Traits
// Traits不能被单独实例化,只能被类所包含 trait SayWorld { public function sayHello() { echo 'World!'; } } class MyHelloWorld { // 将SayWorld中的成员包含进来 use SayWorld; } $xxoo = new MyHelloWorld(); // sayHello() 函数是来自 SayWorld 构件的 $xxoo->sayHello();
优先级
基类中的成员函数将被Traits中的函数覆盖,当前类中的成员函数将覆盖Traits中的函数。
内置 Web 服务器
PHP从5.4开始内置一个轻量级的Web服务器,不支持并发,定位是用于开发和调试环境。
在开发环境使用它的确非常方便。
php -S localhost:8000
动态访问静态方法
$func = "funcXXOO"; A::{$func}();
实例化时访问类成员
(new MyClass)->xxoo();
PHP5.5
yield关键字
yield关键字用于当函数需要返回一个迭代器的时候,逐个返回值。
function number10() { for($i = 1; $i <= 10; $i += 1) yield $i; }
list() 用于 foreach
$array = [ [1, 2, 3], [4, 5, 6], ]; foreach ($array as list($a, $b, $c)) echo "{$a} {$b} {$c}\n";
细节修改
- 不推荐使用 mysql 函数,推荐使用 PDO 或 MySQLi
- 不再支持Windows XP.
- 可用 MyClass::class 取到一个类的完整限定名(包括命名空间)
- empty() 支持表达式作为参数
- try-catch 结构新增 finally 块
PHP5.6
常量增强
定义常量时允许使用之前定义的常量进行计算
const A = 2; const B = A + 1;
로그인 후 복사允许常量作为函数参数默认值
function func($arg = C::STR2)asdf
로그인 후 복사
可变函数参数
用于代替 func_get_args()
function add(...$args) { //... }
同时可以在调用函数时,把数组展开为函数参数:
$arr = [2, 3]; add(1, ...$arr);
命名空间增强
命名空间支持常量和函数
PHP7.0
标量类型声明
四种标量类型:boolean (布尔型),integer (整型),float (浮点型, 也称作 double),string (字符串)
function typeString(string $a) { echo $a; } typeString('sad'); //sad
返回值类型声明
function returnErrorArray(): array { return '1456546'; } print_r(returnErrorArray()); /* Array Fatal error: Uncaught TypeError: Return value of returnArray() must be of the type array, string returned in */
define 定义数组
define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // 输出 "cat"
匿名类
匿名类就像一个没有事先定义的类,而在定义的时候直接就进行了实例化。
// 直接定义 $objA = new class{ public function getName(){ echo "I'm objA"; } }; $objA->getName();
null 合并运算符
$username = $_GET['user'] ?? 'nobody'; //这两个是等效的 当不存在user 则返回?? 后面的参数 $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
PHP7.1
可为空类型
参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。
当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。
<?php function testReturn(): ?string{ return 'elePHPant'; }
void类型
<?php function swap(&$left, &$right) : void{ //... }
多异常捕获
<?php try { // some code } catch (FirstException | SecondException $e) { // ... }
PHP7.2
新的对象类型object
<?php function test(object $obj) : object { return new SplQueue(); } test(new StdClass());
允许重写抽象方法
当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。
<?php abstract class A { abstract function test(string $s); } abstract class B extends A { // overridden - still maintaining contravariance for parameters and covariance for return abstract function test($s) : int; }
PHP7.4
类属性支持类型声明
<?php class User { public int $id; public string $name; }
箭头函数
使用隐式按值作用域绑定定义函数的简写语法。
<?php $factor = 10; $nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]); // $nums = array(10, 20, 30, 40);?>
Null 合并运算符支持方法
<?php $array['key'] ??= computeDefault(); //if (!isset($array['key'])) {$array['key'] = computeDefault();} ?>
Opcache 预加载
Opcache将获取您的PHP源文件,将其编译为“ opcodes”,然后将这些编译后的文件存储在磁盘上。opcache会跳过源文件和PHP解释器在运行时实际需要之间的转换步骤。
PHP8.0
JIT即时编译
PHP8的JIT目前是在Opcache之中提供的
JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码
JIT不是原来Opcache优化的替代,是增强
目前PHP8只支持x86架构的CPU
命名参数
就是具名参数,在调用函数的时候,可以指定参数名称,指定参数名称后,参数顺序可以不安装原函数参数顺序传
//传统方式调用 balance(100, 20); //php8 使用命名参数调用 balance(amount: 100, payment: 20);
注解
使用注解可以将类定义成一个一个低解耦,高内聚的元数据类。在使用的时候通过注解灵活引入,反射注解类实例的时候达到调用的目的。
注解类只有在被实例化的时候才会调用
联合类型
在不确定参数类型的场景下,可以使用
function printSomeThing(string|int $value) { var_dump($value); }
Match表达式
和switch cash差不多,不过是严格===匹配
<?php $key = 'b'; $str = match($key) { 'a' => 'this a', 'c' => 'this c', 0 => 'this 0', 'b' => 'last b', }; echo $str;//输出 last b
Nullsafe 运算符
//不实例 User 类,设置为null $user = null; echo $user->getName();//php8之前调用,报错 echo $user?->getName();//php8调用,不报错,返回空
构造器属性提升
在构造函数中可以声明类属性的修饰词作用域
<?php // php8之前 class User { protected string $name; protected int $age; public function __construct(string $name, int $age) { $this->name = $name; $this->age = $age; } } //php8写法, class User { public function __construct( protected string $name, protected int $age ) {} }
推荐学习:《PHP视频教程》
위 내용은 한 기사에서는 PHP5-8 각 버전의 기능을 자세히 설명합니다. [요약]의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.
