你真的了解現在的PHP嗎?

PHPz
發布: 2023-03-07 10:18:02
原創
1108 人瀏覽過

前段時間,公司的專案從PHP5.3升級到PHP7,現在專案開始使用PHP7的一些新語法與特性。

在看這本書你真的了解現在的PHP嗎?
一、特性

1.

命名空間

命名空間用的比較多,不詳細寫了,記錄幾個值得注意的實踐和細節。 use語句:
<?php
use Symfony\Component\HttpFoundation\Request,
    Symfony\Component\HttpFoundation\Response,
    Symfony\Component\HttpFoundation\Cookie;
登入後複製

一個檔案中使用多個命名空間


你可以這麼做,但這違背了「一個檔案定義一個類別」的良好實踐。 ##如果Exception前面不加\ 符號,會在My\App命名空間下尋找Exception類別。靈活,能委託其他人實現細節 使用的人只需要關心有什麼接口,而不需要關心實現。 . 性狀

在學習laravel

框架

之前都沒弄清楚性狀(trait)。不是。

舉個具體的例子,例如有兩個類,Car 和Phone,他們都需要GPS功能。 它。都實作這個介面。
#第三反應創造實現GPS功能的性狀(trait),然後在Car和Phone類別中混入這個性狀。能實現功能,不影響繼承結構,不重複實現,完美。

建立與使用性狀

建立trait

<?php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Cookie;
登入後複製

#使用trait
<?php
namespace Foo {
  //code
}

namespace Bar {
  //code 
}
登入後複製
4.

產生器

#PHP生成器(generator)是PHP5.5.0引進的新功能,很多PHP開發者產生器不了解。生成器是個簡單的迭代器,但生成器不要求實作Iterator介面。生成器會根據需要計算並產生要迭代的值。如果不

查詢

,生成器永遠不知道下一個要迭代的值是什麼,在生成器中無法後退或快轉。具體看如下兩個範例:

簡單的生成器

具體場景:使用生成器處理CSV檔案

<?php
trait MyTrait{
  //实现
}
登入後複製

處理這種場景,習慣的處理方法是先讀取檔案的所有內容放到
陣列中,然後再做處理等等。這種的處理存在的問題是:當檔案特別大,一次讀取就佔用很多記憶體資源。而生成器最適合這種場景,因為這樣佔用的系統記憶體量極少

5. 閉包

理論上,閉包和

匿名函數是不同的概念。不過,PHP將其視為相同的概念。
簡單閉包

<?php
class MyClass
{
  use MyTrait;
  // 类的实现
}
登入後複製

注意:我們之所以能呼叫$closure

變數,是因為這個變數的值是個閉包,而且閉包物件

實作了invoke()

魔術方法。只要變數名稱後面有(),PHP就會找並呼叫invoke()方法。

附加状态
使用use关键字可以把多个参数传入闭包,此时要像PHP函数或方法的参数一样,使用逗号分隔多个参数。

<?php
function enclosePerson($name) {
  return function ($doCommand) use ($name) {
    return sprintf(&#39;%s, %s&#39;, $name, $doCommand);
  };
}

// 把字符串“Clay”封装在闭包中
$clay = enclosePerson(&#39;Clay&#39;);

// 传入参数,调用闭包
echo $clay(&#39;get me sweet tea!&#39;);
// 输出 --> "Clay, get me sweet tea!"
登入後複製

使用bindTo()方法附加闭包的状态
PHP框架经常使用bindTo()方法把路由URL映射到匿名回调函数上,框架会把匿名函数绑定到应用对象上,这么做可以在这个匿名函数中使用$this关键字引用重要的应用对象。例子如下:

<?php
class App
{
  protected $routes = array();
  protected $responseStatus = &#39;200 OK&#39;;
  protected $responseContentType = &#39;text/html&#39;;
  protected $responseBody = &#39;Hello world&#39;;

  public function addRoute($routePath, $routeCallback)
  {
    $this->routes[$routePath] = $routeCallback->bindTo($this, CLASS);//重点
  }

  public function dispatch($currentPath)
  {
    foreach ($this->routes as $routePath => $callback) {
      if ($routePath === $currentPath) {
        $callback();
      }
    }

    header('HTTP/1.1' . $this->responseStatus);
    header('Content-type:' . $this->responseContentType);
    header('Content-length' . mb_strlen($this->responseBody));
    echo $this->responseBody;
  }
}
登入後複製

第11行是重点所在,把路由回调绑定到了当前的App实例上。这么做能在回调函数中处理App实例的状态:

<?php
$app = new App();
$app->addRoute('/users/josh', function () {
  $this->responseContentType = 'application/json;charset=utf8';
  $this->responseBody = '{"name": "Josh"}';
});
$app->dispatch('/users/josh');
登入後複製

6. Zend OPcache

字节码缓存不是PHP的新特性,很多独立的扩展可以实现缓存。从PHP5.5.0开始,PHP内置了字节码缓存功能,名为Zend OPcache。

字节码缓存是什么
PHP是解释性语言,PHP解释器执行PHP脚本时会解析PHP脚本代码,把PHP代码编译成一系列Zend操作码,然后执行字节码。每次请求PHP文件都是这样,会消耗很多资源。字节码缓存能存储预先编译好的PHP字节码。这意味着,请求PHP脚本时,PHP解释器不用每次都读取、解析和编译PHP代码。这样能极大地提升应用的性能。

7. 内置的HTTP服务器

从PHP5.4.0起,PHP内置了Web服务器,这对众多使用Apache或nginx的php开发者来说,可能是个隐藏功能。不过,这个内置的服务器功能并不完善,不应该在生产环境中使用,但对本地开发来说是个便利的工具,可以用于快速预览一些框架和应用。

启动服务器

php -S localhost:4000
登入後複製

配置服务器

php -S localhost:8000 -c app/config/php.ini
登入後複製

路由器脚本
与Apache和nginx不同,它不支持.htaccess文件。因此,这个服务器很难使用多数流行的PHP框架中常见的前端控制器。PHP内置的服务器使用路由器脚本弥补了这个遗漏的功能。处理每个HTTP请求前,会先经过这个路由器脚本,如果结果为false,返回当前HTTP请求中引用的静态资源URI。

php -S localhost:8000 route.php
登入後複製

是否为内置的服务器

<?php
if (php_sapi_name() === 'cli-server') {
  // php 内置的web服务器
}
登入後複製

       

以上是你真的了解現在的PHP嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!