Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
29
篇与
的结果
2023-12-31
PHP8的新功能揭秘:JIT编译器让你的网站速度瞬间飙升!
PHP8的新功能揭秘:JIT编译器让你的网站速度瞬间飙升!世界上最流行的服务器脚本语言之一,PHP一直以其简洁的语法和灵活的特性吸引着开发者的关注。然而,由于其解释执行的本质,PHP在某些情况下可能会遇到性能瓶颈。为了解决这个问题,PHP 8.0版本引入了JIT(Just-in-Time)编译器,它可以显著提升PHP脚本的执行速度。本文将详细介绍PHP中的JIT以及如何在代码中体现出来。JIT编译器的原理JIT编译器是一种在运行时将解释的字节码或中间代码转换为机器码的技术。与传统的解释执行方式相比,JIT编译器可以将代码编译成本地机器码,并缓存编译后的结果,以便在下一次执行同一段代码时直接使用。这样一来,不仅可以减少解释执行的开销,还可以利用底层硬件的优化功能,提升代码的执行速度。在PHP中,JIT编译器是作为PHP引擎的一部分实现的。当PHP脚本被执行时,JIT编译器会检查频繁运行的代码块,并将其编译为本地机器码。这使得代码块的执行速度得到了显著提升,特别是对于循环和重复执行的代码片段。在PHP中启用JIT编译器启用JIT编译器非常简单,只需将php.ini配置文件中的"opcache.jit_buffer_size"选项设置为大于0的值即可。通常,建议将其设置为256M,以确保JIT编译器有足够的空间来缓存编译结果。此外,还可以通过"opcache.jit"选项启用或禁用JIT编译器的功能。在代码中使用JIT编译器 为了更好地了解JIT编译器的作用,我们将通过一个简单的示例来演示。考虑以下PHP代码片段:<?php function calculate($a, $b) { $result = 0; for ($i = 0; $i < 100000; $i++) { $result += $a * $b; } return $result; } $start = microtime(true); $result = calculate(2, 3); $end = microtime(true); echo "Result: " . $result . "\n"; echo "Time: " . ($end - $start) . " seconds\n"; ?>在没有启用JIT编译器的情况下,执行这段代码可能需要一定的时间。然而,一旦启用了JIT编译器,后续的执行会更加快速。为了验证这一点,我们可以通过以下步骤进行测试:在php.ini配置文件中启用JIT编译器(设置"opcache.jit"为1)并保存配置文件。执行上述代码片段,并记录执行所需的时间。通过对比启用和禁用JIT编译器后的执行时间,我们可以明显看到JIT编译器的效果。结论:JIT编译器是PHP 8.0版本引入的一项重要功能,它可以显著提升PHP脚本的执行速度。通过将频繁执行的代码块编译成本地机器码,并缓存编译结果,JIT编译器在一定程度上消除了PHP解释执行的性能瓶颈。通过在php.ini配置文件中启用JIT编译器,并在代码中使用合适的方式,我们可以充分利用JIT编译器的优势,提高PHP应用程序的性能。然而,值得注意的是,并非所有的PHP代码都能从JIT编译器中获得相同的性能提升。JIT编译器只针对频繁执行的代码块进行优化,因此只有当业务逻辑中存在循环和重复执行的代码片段时,才能真正体现JIT编译器的价值。因此,在使用JIT编译器时,开发人员应该有意识地结构化代码,以使得性能关键的部分能够受益于JIT编译器的优化。总而言之,JIT编译器在提升PHP应用程序性能方面发挥着重要作用。如果你是一位PHP开发人员,不妨尝试启用JIT编译器,并根据你的业务需求对代码进行适当的优化,以获得更好的性能体验。
2023年12月31日
12 阅读
0 评论
0 点赞
2023-12-31
PHP中你一定要知道和会用的几个特殊符号
PHP中你一定要知道和会用的几个特殊符号PHP是一种面向Web开发的服务器端脚本语言,它具有简单易学、功能强大、扩展性好等特点,广泛用于构建动态网页和Web应用。PHP7是PHP编程语言的最新版本,相较于之前的版本,它引入了许多新特性和改进。本文将着重介绍PHP7新增的特殊符号及其用法,帮助开发人员更好地理解和应用这些特性。特殊符号新增说明!==这个特殊符号用于比较两个变量的值和类型是否不相等。在之前的版本中,我们只能使用!=来比较两个变量的值是否不相等,而不考虑类型。而PHP7中,!==可以同时比较值和类型是否不相等。这个特殊符号用于比较两个变量的值,返回一个整数值,表示两个变量的大小关系。如果第一个变量小于第二个变量,返回-1;如果第一个变量等于第二个变量,返回0;如果第一个变量大于第二个变量,返回1。??=这个特殊符号用于声明和赋值一个变量,当且仅当该变量为null时才进行赋值操作。也就是说,如果变量已经有了非null的值,那么不会进行赋值操作。::这个特殊符号用于表示静态方法和类常量的访问。在之前的版本中,我们使用类名加上双冒号来访问静态方法和类常量,而PHP7中则允许使用对象实例名称来代替类名。?? (空合并运算符)该符号用于简化判断变量是否为null的操作,如果指定的变量为null,则返回其后面的值,否则返回该变量的值。<=>该符号用于比较两个变量的大小,返回一个整数值,表示两个变量的大小关系。和<=>类似,但它会同时比较值和类型是否相等。@该符号用于抑制错误消息的输出。在PHP中,当一个表达式发生错误时,会输出错误消息。而使用@符号可以使得该表达式发生错误时不输出错误消息。特殊符号详细案例代码与注释1. !==<?php $a = 10; $b = "10"; if ($a !== $b) { // 值和类型都不相等 echo "a and b are not equal in value and type"; } else { echo "a and b are equal in value and type"; } ?>注释:此示例演示了如何使用!==比较两个变量的值和类型是否不相等。2. <?php $a = 1; $b = 2; echo $a <=> $b; // 输出-1,表示$a小于$b ?>注释:此示例演示了如何使用<=>比较两个变量的值,并返回一个表示大小关系的整数值。3. ??=<?php $a = null; $a ??= "default value"; // $a为空,赋值为"default value" echo $a; // 输出"default value" ?>注释:此示例演示了如何使用??=声明并赋值一个变量,如果该变量为null时才进行赋值操作。4. ::<?php class Example { public static function hello() { echo "Hello, World!"; } } $instance = new Example(); $instance::hello(); // 输出"Hello, World!" ?>注释:此示例演示了如何使用对象实例名称来访问类的静态方法。5. ??<?php $a = null; $b = 10; echo $a ?? $b; // $a为null,输出10 ?>注释:此示例演示了如何使用??判断变量是否为null,并根据判断结果返回不同的值。6. <=><?php $a = 1; $b = "1"; echo $a <=> $b; // 输出0,表示$a等于$b ?>注释:此示例演示了如何使用<=>比较两个变量的值和类型是否相等,并返回一个表示大小关系的整数值。7. @<?php $file = @file_get_contents("nonexistent_file.txt"); // 尝试读取一个不存在的文件 if (!$file) { echo "An error occurred while reading the file."; // 由于使用了@符号,不会输出错误消息 } ?>注释:此示例演示了如何使用@符号来抑制错误消息的输出。结论:通过本文的介绍,我们了解了PHP7中新增的特殊符号及其用法,包括!==、、??=、::、??、<=>和@。这些特殊符号可以帮助开发人员更方便地进行变量的比较、赋值和错误处理等操作。在实际的PHP开发中,我们可以根据具体的需求灵活运用这些特殊符号,提高开发效率和代码可读性。
2023年12月31日
10 阅读
0 评论
0 点赞
2023-08-12
PHP的可调用类型(callable)总结
PHP的可调用类型(callable)总结// 1 普通函数 call_user_func('my_function'); // 2类的静态方法 call_user_func(['MyClass', 'myCallbackMethod']); // 3对象方法 call_user_func([new MyClass(), 'myCallbackMethod']); //4类的静态方法(2) call_user_func('MyClass::myCallbackMethod'); //5匿名函数 call_user_func(function(){echo '匿名函数';}); //6箭头函数 call_user_func(fn() =>print('箭头函数')); //7相对关系 call_user_func(array('B', 'parent::who')); // 8: Objects implementing __invoke can be used as callables class C { public function __invoke($name) { echo 'Hello ', $name, "\n"; } }$c = new C(); call_user_func($c, 'PHP!'); ?>其它用法:call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0 call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0 class myclass { static function say_hello() { echo "Hello!\n"; } } $classname = "myclass"; call_user_func(array($classname, 'say_hello')); call_user_func($classname .'::say_hello'); // As of 5.2.3 $myobject = new myclass(); call_user_func(array($myobject, 'say_hello'));
2023年08月12日
12 阅读
0 评论
0 点赞
2023-08-11
一文详解 PHP 8 的新特性
一文详解 PHP 8 的新特性PHP 8 将于 2020 年 11 月 26 日发布。这是一个新的主要版本,这意味着它将引入一些突破性的更改,以及许多新功能和性能改进。现在 PHP 8 在功能冻结中,这意味着不能再添加任何新功能了。由于重大更改,您需要在代码中进行一些更改才能在 PHP 8 上运行。但是,如果您已经跟上最新版本,升级应该不会太难,因为大多数重大更改以前在 7.* 版本中已弃用。别担心,所有这些弃用都列在这篇文章中。除了突破性变化外,PHP 8 还带来了一系列不错的新功能,如 JIT 编译器、联合类型、attributes等。新特性联合类型rfc鉴于 PHP 的动态类型性质,在很多情况下,联合类型可能很有用。联合类型是两种或更多类型的集合,指示可以使用其中一种类型。public function foo(Foo|Bar $input): int|float;请注意,void永远不能是联合类型的一部分,因为它指示"没有任何返回值"。此外,可以使用|null编写nullable,也可以使用现有的?符号:public function foo(Foo|null $foo): void;public function bar(?Bar $bar): void;JIT rfcJIT (just in time:即时编译) 编译器承诺显著改进性能,尽管并不总是在 Web 请求的上下文中。我已经在真实的Web应用程序上做了我自己的基准测试,而且似乎JIT在这类PHP项目上并没有产生太大的影响。最重大的特性非 JIT 莫属。该特性的研发历时多年,熬过了 PHP 5 与 7 大版本系列(PHP 6 项目流产),直到去年 3 月份才最终通过投票确认将进入 PHP 8。JIT 是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行。在 PHP 中,这意味着 JIT 将为 Zend VM 生成的指令视为中间表述,并以依赖于体系结构的机器码执行,也就是说托管代码的不再是 Zend VM,而是更为底层的 CPU。虽然自 PHP 7.0 以来,通过优化核心数据结构 HashTable、强化 Zend VM 中某些操作码与持续改进 OPCache 的 Optimizer 组件等具体措施,PHP 性能得到了显著提升,但是实际上这些优化似乎已经走到极限了。现在 JIT 从底层着手,被认为是目前提升 PHP 性能的最佳出路。关于引入 JIT 后的性能对比(以及 PHP 8 整体性能),可以参考一下 Phoronix 的基准测试(注:用的是 5 月底的源码构建版进行的测试)。下面是 PHP 开发团队提供的相关对比数据:如果您想详细了解 JIT 可以为 PHP 做什么,您可以阅读我在这里写的另一篇帖子。null安全操作符 rfc如果您熟悉null coalescing operator,您已经熟悉了它的缺点:它无法处理方法调用。相反,您需要中间检查,或者依赖于某些框架提供的可选帮助程序:$startDate = $booking->getStartDate();$dateAsString = $startDate ? $startDate->asDateTimeString() : null;通过添加 null安全运算符,我们现在可以在方法上具有空合并(null coalescing-like)一样的行为!$dateAsString = $booking->getStartDate()?->asDateTimeString();命名参数 rfc命名参数允许您通过指定值名称将值传递给函数,这样您就不必考虑它们的顺序,还可以跳过可选参数!function foo(string $a, string $b, ?string $c = null, ?string $d = null) { / … / }foo(b: 'value b', a: 'value a', d: 'value d',);您可以在此帖子中深入阅读它们。Attributes注解 rfcAttributes(在其他语言中通常称为注解:annotations)提供了一种向类添加元数据的方法,而无需分析文档块。关于快速查看,下面是 RFC 中attributes外观的示例:use App\Attributes\ExampleAttribute;@@ExampleAttributeclass Foo{@@ExampleAttribute public const FOO = 'foo'; @@ExampleAttribute public $x; @@ExampleAttribute public function foo(@@ExampleAttribute $bar) { }}@@Attributeclass ExampleAttribute{public $value; public function __construct($value) { $this->value = $value; }}请注意,此基本Attribute在原始 RFC 中称为PhpAttribute,但后来被另一个 RFC 更改。如果你想深入探讨attributes如何工作,以及如何建立自己的attributes;您可以在此博客上深入阅读attributes。另请注意,attribute语法仍然可以更改,它尚未决定。Match表达式 rfc你可以称它为switch表达式的大哥:match可以返回值,不需要break语句,可以组合条件,使用严格的类型比较,并且不执行任何类型的强制。如下所示:$result = match($input) {0 => "hello", '1', '2', '3' => "world",};您可以在此处详细阅读match表达式。Constructor property promotion(构造函数属性提升) rfc此 RFC 添加语法糖来创建值对象或数据传输对象。不用为类属性和构造函数指定它们,PHP 现在可以将它们合并为一个。代替如下代码:class Money {public Currency $currency; public int $amount; public function __construct( Currency $currency, int $amount, ) { $this->currency = $currency; $this->amount = $amount; }}你可以这样做:class Money {public function __construct( public Currency $currency, public int $amount, ) {}}关于property promotion,还有很多要讲的,你可以在这个帖子阅读。新的 static 返回类型 rfc虽然已经可以返回self,但static在 PHP 8 之前不是有效的返回类型。鉴于PHP的动态类型性质,这功能对许多开发人员都很有用。class Foo{public function test(): static { return new static(); }}新的 mixed 类型 rfc有些人可能称之为必要的邪恶:mixed类型导致许多人有复杂的感觉。不过, 有一个很好的论据可以提出: 一个缺少的类型在 Php 中可能意味着很多事情:函数不返回任何东西或返回null我们期待几种类型之一我们期待一个类型,不能在PHP中进行类型提示Because of the reasons above, it's a good thing the mixed type is added. mixed itself means one of these types:由于上述原因,添加mixed类型是件好事。mixed本身意味着以下类型之一:arrayboolcallableintfloatnullobjectresourcestring请注意,mixed也可以用作参数或属性类型,而不仅仅是作为返回类型。另请注意,由于mixed已包含null,因此不允许使其为空(nullable)。以下将触发错误:// Fatal error: Mixed types cannot be nullable, null is already part of the mixed type.function bar(): ?mixed {}Throw表达式 rfc此 RFC 将throw 从语句更改为表达式,从而有可能在许多新位置引发异常:$triggerError = fn () => throw new MyError();$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');继承私有方法 rfc以前,PHP 用于对public、protected和private方法应用相同的继承检查。换句话说:private方法应遵循与protected方法和public方法相同的方法签名规则。这没有意义,因为子类无法访问私有方法。此 RFC 更改了该行为,以便不再对私有方法执行这些继承检查。此外,使用final private function也没有意义,这样做现在将触发警告:Warning: Private methods cannot be final as they are never overridden by other classesWeak maps rfc基于 PHP 7.4 中添加的weakrefs RFC,在 PHP 8 中添加了WeakMap实现。WeakMap保留对对象的引用,这些引用不会阻止这些对象被垃圾回收。以 ORM 为例,它们通常实现缓存,这些缓存保存对实体类的引用,以提高实体之间的关系性能。这些实体对象不能被垃圾回收,只要此缓存具有对它们的引用,即使缓存是唯一引用它们的对象。如果此缓存层使用弱引用和映射代替,PHP 将垃圾收集这些对象当再没有别的引用他们了。特别是在 ORM 的情况下,它可以管理请求中的数百个,如果不是数千个实体;weak maps可以提供更好、更资源友好的处理这些对象的方法。下面是weak maps的外观,来自 RFC 的示例:class Foo {private WeakMap $cache; public function getSomethingWithCaching(object $obj): object { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); }}允许 ::class 在对象上 rfc一个小的,但有用的,新功能:现在可以使用::class在对象上,而不必使用get_class() 。它的工作方式与get_class()一样。$foo = new Foo();var_dump($foo::class);Non-capturing catches rfc每当你想捕获到一个异常在PHP 8之前,你必须将它存储到一个变量中,不管你是否使用该变量。用non-capturing catches,你可以省略变量,代替这样try {// Something goes wrong} catch (MySpecialException $exception) {Log::error("Something went wrong");}你可以这样做:try {// Something goes wrong} catch (MySpecialException) {Log::error("Something went wrong");}请注意,需要始终指定类型,不允许空的catch。如果要捕获所有异常和错误,可以使用"Throwable"作为捕获类型。参数列表中的尾随逗号 rfc在调用函数时,参数列表中仍然缺少尾随逗号支持。这现在允许在PHP 8中,这意味着您可以执行以下操作:public function(string $parameterA, int $parameterB, Foo $objectfoo,) {// …}旁注:在闭包的use列表中也支持尾随逗号,这是一个疏忽,现在通过单独的 RFC 添加。从interface创建 DateTime 对象您已经可以使用DateTime::createFromImmutable($immutableDateTime) 创建DateTime 对象从DateTimeImmutable对象,但另一方面却很棘手。通过添加DateTime::createFromInterface()和DatetimeImmutable::createFromInterface() 现在有一种通用的方式将DateTime 和DateTimeImmutable 互转换。DateTime::createFromInterface(DateTimeInterface $other);DateTimeImmutable::createFromInterface(DateTimeInterface $other);新的 Stringable interface rfcStringable接口可用于任何字符串的类型提示或实现__toString()。此外,每当类实现__toString(),它会自动实现幕后的接口,并且无需手动实现它。class Foo{public function __toString(): string { return 'foo'; }}function bar(Stringable $stringable) { / … / }bar(new Foo());bar('abc');新的 str_contains() 函数 rfc有些人可能会说它早就该有了,但我们终于不必再依赖strpos() 来知道字符串是否包含另一个字符串了。代替如下:if (strpos('string with lots of words', 'words') !== false) { / … / }你可以这样做if (str_contains('string with lots of words', 'words')) { / … / }新的 str_starts_with() 和 str_ends_with() 函数 rfc另外两个早就应该有了,这两个函数现在添加到核心中。str_starts_with('haystack', 'hay'); // truestr_ends_with('haystack', 'stack'); // true新的 fdiv() 函数 pr新的fdiv() 函数执行类似于fmod()和intdiv() 函数,允许除以0。而不是错误地得到INF, -INF 或 NAN,具体取决于情况。新的 get_debug_type() 函数 rfcget_debug_type()返回变量的类型。听起来像是gettype()会做的吗?get_debug_type()返回数组、字符串、匿名类和对象的更有用的输出。例如,在类\Foo\Bar上调用gettype()将返回object。使用get_debug_type() 将返回类名。可以在 RFC 中找到get_debug_type()和gettype()之间的差异的完整列表。新的 get_resource_id() 函数 pr资源是 PHP 中的特殊变量,指的是外部资源。一个示例是 MySQL 连接,另一个是文件句柄。这些资源中的每个资源都会被分配一个 ID,尽管以前知道 ID 的唯一方法就是将资源强制转换到int:$resourceId = (int) $resource;PHP 8 添加了get_resource_id() 函数,使此操作更加明显且类型安全:$resourceId = get_resource_id($resource);traits 中的抽象方法改进 rfcTraits 可以指定抽象方法,这些方法必须由使用它们的类实现。但有一个警告:在PHP8之前,这些方法实现的签名没有经过验证。以下有效:trait Test {abstract public function test(int $input): int;}class UsesTrait{use Test; public function test($input) { return $input; }}PHP 8 将在使用trait并实现其抽象方法时执行正确的方法签名验证。这意味着您需要如下写法:class UsesTrait{use Test; public function test(int $input): int { return $input; }}对象实现的 token_get_all() rfctoken_get_all()函数返回数组值。此 RFC 添加了一个俱有PhpToken::getAll()方法的PhpToken类。此实现适用于对象而不是纯值。它消耗的内存更少,更易于阅读。变量语法调整 rfc在统一变量语法RFC解决了一些在PHP的变量语法的不一致。该RFC旨在解决少数被忽视的情况。内部函数的类型注解 externals很多人投入,以添加适当的类型注释到所有内部函数。这是一个长期的问题,最终可以解决与以前版本中对PHP所做的所有更改。这意味着内部函数和方法在反射中将具有完整的类型信息。ext-json 扩展始终可用 rfc以前,在没有启用 JSON 扩展的情况下编译 PHP 是可能的,现在这不再可能了。由于 JSON 被广泛使用,因此最好开发人员始终可以依赖它的存在,而不必首先确保扩展存在。重大更改如前所述:这是一个主要版本更新,因此会有重大的变化。最好的做法是查看升级文档中的中断更改的完整列表。不过,这些重大更改中有许多在以前的 7.* 版本中已被弃用,因此,如果您多年来一直保持最新状态,升级到 PHP 8 应该不会那么困难。一致的类型错误 rfcPHP 中的用户定义的函数将引发TypeError,但内部函数没有,它们宁愿发出警告并返回null。自PHP 8起,内部函数的行为已经保持一致。重新分类的引擎警告 rfc以前只触发警告或通知的很多错误已转换为正确的错误。以下警告已更改。未定义的变量:Error异常而不是通知未定义的数组索引:警告而不是通知按零划分:除零错误而不是警告而划分尝试增加/递增非对象的"%s"属性:错误异常而不是警告尝试修改非对象的属性"%s":错误异常而不是警告尝试分配非对象的属性"%s":错误异常而不是警告从空值创建默认对象:错误异常而不是警告尝试获取非对象的属性"%s":警告而不是通知未定义属性: %s::$%s:警告而不是通知无法将元素添加到数组,因为下一个元素已被占用:错误异常而不是警告无法在非数组变量中取消设置偏移量:错误异常而不是警告不能将标量值用作数组:错误异常而不是警告只能解包数组和可遍历:类型错误异常而不是警告为每例提供无效参数():类型错误异常而不是警告非法偏移类型:类型错误异常而不是警告非法偏移类型设置或空:类型错误异常而不是警告未设置的非法偏移类型:类型错误异常而不是警告数组到字符串转换:警告而不是通知资源 ID#%d 用作偏移量,强制转换为整数 (%d):警告而不是通知出现字符串偏移转换:警告而不是通知未初始化字符串偏移量:%d:警告而不是通知无法将空字符串分配给字符串偏移量:错误异常而不是警告提供的资源不是有效的流资源:TypeError 异常而不是警告@ 操作符不再抑制致命错误此更改可能会揭示 PHP 8 之前再次隐藏的错误。请确保在生产环境设置display_errors=Off!默认的错误报告级别现在E_ALL代替一切, 除了E_NOTICE 和 E_DEPRECATED。这意味着许多错误可能会弹出,这些错误以前被静默忽略,尽管在PHP 8之前可能已经存在。默认PDO的错误模式 rfc从 RFC:PDO 的当前默认错误模式为silent。这意味着,当发生 SQL 错误时,除非开发人员实现自己的显式错误处理,否则不会发出任何错误或警告,也未引发异常。此 RFC 更改默认错误将更改为PDO::ERRMODE_EXCEPTION 在PHP 8 中。串联优先级 rfc虽然在 PHP 7.4 中已弃用,但此更改现已生效。如果您要写类似的东西:echo "sum: " . $a + $b;PHP 以前会这样解释:echo ("sum: " . $a) + $b;PHP 8 将使其被解释为:echo "sum: " . ($a + $b);对算术和位运算符进行更严格的类型检查 rfc在 PHP 8 之前,可以对数组、资源或对象应用算术或位运算符。这不再可能了,并且会引发TypeError:[] % [42];$object + 4;命名空间名称成为一个单个token rfcPHP 用于将命名空间的每个部分(用反斜杠\分隔 )解释为令牌序列。此 RFC 改变了该行为,这意味着保留名称现在可以在命名空间中使用更合理的数字字符串 rfcPHP 的类型系统尝试在遇到字符串中的数字时执行许多智能操作。这种 RFC 使这种行为更加一致和清晰。更理智的字符串与数字比较 rfc此 RFC 修复了 PHP 中非常奇怪的情况,其中0 == "foo"结果为true。还有其他一些边缘情况,此 RFC 修复它们。反射方法签名更改反射类的三个方法签名已更改:ReflectionClass::newInstance($args);ReflectionFunction::invoke($args);ReflectionMethod::invoke($object, $args);现在已成为:ReflectionClass::newInstance(...$args);ReflectionFunction::invoke(...$args);ReflectionMethod::invoke($object, ...$args);升级指南指定,如果扩展这些类,并且仍希望同时支持 PHP 7 和 PHP 8,则允许以下签名:ReflectionClass::newInstance($arg = null, ...$args);ReflectionFunction::invoke($arg = null, ...$args);ReflectionMethod::invoke($object, $arg = null, ...$args);稳定排序 rfc在PHP 8之前,排序算法是不稳定的。这意味着无法保证等值元素的顺序。PHP 8 将所有排序函数的行为更改为稳定的排序。不兼容的方法签名的致命错误 rfc从 RFC:由于不兼容的方法签名导致的继承错误当前引发致命错误或警告,具体取决于错误的原因和继承层次结构。其它弃用和更改在 PHP 7.* 开发期间,添加了几个弃用,这些弃用现在在 PHP 8 中完成。Deprecations in PHP 7.2Deprecations in PHP 7.3Deprecations in PHP 7.4Locale-independent float to string cast附件:The match operator in PHP 8Named arguments in PHP 8Property promotion in PHP 8The latest PHP version — 如何管理现代 PHP 版本Attributes in PHP 8 — 仔细查看attributes,也称为注释2020年的PHPPHP7.4新特性PHP 7.3新特性PHP中文站
2023年08月11日
10 阅读
0 评论
0 点赞
2023-08-11
最新PHP中的const和define 定义常量的区别
最新PHP中的const和define 定义常量的区别常量是一个简单的标识符。在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量)。常量大小写敏感(php 7.4*)。通常常量标识符总是大写的。const 通常用于类成员变量的定义。define不可用于类成员变量的定义,可用于全局常量。const是在编译时定义, 不能在函数,循环及if条件中使用; 函数define() 定义的常量是在执行define()函数时定义的,因此可以在函数内、循环内、if语句内等函数能够被调用的任何地方使用define()函数定义常量。<?phpconst FOO='BAR';//有效的validdefine('FOO', 'BAR');// 有效的validif (1) {const FOO='BAR';//无效的invalid}if (1) {define('FOO', 'BAR');// 有效的valid}3 .const定义的常量时大小写敏感的,而define可通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感(php7.4被弃用)。例如:<?phpdefine('FOO', 'BAR', true); //不区分大小写的常量的声明已从php7.4被弃用。现在将其TRUE作为第三个参数传递 给define()会生成弃用警告。不建议使用不区分大小写的常量const BAR =123;echo BAR;echo FOO;// BARecho foo; // BARconst的常量命名只能用直白的文本,而define()允许你用任何表达式来对常量命名。这样我们就可以执行以下操作:for ($i = 0; $i < 32; ++$i) {define('BIT_'. $i, 1<< $i);}类常量可见性从 php7.4开始支持.class ConstDemo{const PUBLIC_CONST_A=1;public const PUBLIC_CONST_B=2;protected const PROTECTED_CONST=3;private const PRIVATE_CONST=4;}需要注意的一点是,const可以在class和interface当中使用定义类常量 ,而define是做不到这一点的,但define可以在类方法中使用:class Foo {const BAR=2; // 有效}class Baz {define('QUX', 2); // 无效public function foo(define('QUX', 2); // 有效)}const默认在当前的namespace下定义常量,而使用define则需要你写明整个namespace的完整路径:命名空间的示例namespace A\B\C;// 如果要定义常量 A\B\C\FOO:const FOO = 'BAR';define('A\B\C\FOO', 'BAR');namespace A{const A1 = 1; //处在命名空间A中define('A2', 2); //全局可调用define('A\A3', 3); //处在命名空间A中}namespace B{use const\A\A1;use const\A\A3;echo A1;echo A2; //全局调用echo A3;}
2023年08月11日
9 阅读
0 评论
0 点赞
1
2
3
...
6