ホームページ  >  記事  >  バックエンド開発  >  PHP 5.3 の新機能と非推奨関数の概要

PHP 5.3 の新機能と非推奨関数の概要

WBOY
WBOYオリジナル
2016-06-20 13:02:451245ブラウズ

PHP が WEB 処方において最も人気のあるテクノロジーの 1 つになったことは疑いの余地がありません。 nexen.net の調査によると、インターネット上の Web サイトの 3 分の 1 がサーバーサイド プログラムの開発に PHP を選択しています。ヨーロッパ、アメリカ、日本などの国々では、PHP 開発市場が活況を呈しており、Facebook、Yahoo!、Flickr、Sourceforge などの有名な PHP サイトが無数に存在します。近年、国内の大手Webサイトでは徐々にPHPが多量に使用されるようになりました。

活発でよく組織された開発コミュニティに依存して、PHP 言語自体は着実に進歩しています。一方では、パフォーマンスと安定性が向上し続け、他方では、さまざまな実用的な開発ツールが追加されています。他のプログラミング言語の利点を活用して言語機能を強化します。今日の PHP は、シンプルで学習しやすい構文 (C など) を維持しながら、強力なオブジェクト指向開発 (Java など) をサポートできます。同時に、PHP には非常に多様な実用的な関数、拡張機能、およびクラスもあります。 WEB開発にとても便利なライブラリです。さらに、オブジェクト指向開発が徐々に普及するにつれて、さまざまなオープンソースの PHP クラス ライブラリや開発フレームワークが際限なく登場します。

2009 年 6 月末、PHP は PHP5.3.0 を正式にリリースしました。これは、多くのバグ (140 以上) が修正され、PHP プログラマーが待ち望んでいた多くの新機能をもたらすため、珍しい PHP バージョンです。これらの機能の一部は当初 PHP6 でリリースされる予定でしたが、需要が高かったため、事前に PHP5.3 でリリースされました。

PHP5.3 の優れた点を見てみましょう。

1. PHP 5.3 で非推奨となった機能と関数

PHP 5.3.0 では、E_DEPRECATED と E_USER_DEPRECATED という 2 つの新しいエラー レベルが追加されています。エラー レベル E_DEPRECATED は、関数が非推奨であることを示すために使用されます。E_USER_DEPRECATED レベルの目的は、同様に、ユーザー コードで非推奨の機能であることを示すことです。 E_USER_ERROR および E_USER_WARNING レベル

以下は、非推奨の INI ディレクティブのリストです。次のディレクティブのいずれかを使用すると、
エラーが発生します。

define_syslog_variables 
register_globals 
register_long_arrays 
safe_mode 
magic_quotes_gpc 
magic_quotes_runtime 
magic_quotes_sybase 



非推奨の関数:

call_user_method() (使用 call_user_func() 替代) 
call_user_method_array() (使用 call_user_func_array() 替代) 
define_syslog_variables() 
dl() 
ereg() (使用 preg_match() 替代) 
ereg_replace() (使用 preg_replace() 替代) 
eregi() (使用 preg_match() 配合 'i' 修正符替代) 
eregi_replace() (使用 preg_replace() 配合 'i' 修正符替代) 
set_magic_quotes_runtime() 以及它的别名函数 magic_quotes_runtime() 
session_register() (使用 $_SESSION 超全部变量替代) 
session_unregister() (使用 $_SESSION 超全部变量替代) 
session_is_registered() (使用 $_SESSION 超全部变量替代) 
set_socket_blocking() (使用 stream_set_blocking() 替代) 
split() (使用 preg_split() 替代) 
spliti() (使用 preg_split() 配合 'i' 修正符替代) 
sql_regcase() 
mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代) 
mysql_escape_string() (使用 mysql_real_escape_string() 替代) 
废弃以字符串传递区域设置名称. 使用 LC_* 系列常量替代. 
mktime() 的 is_dst 参数. 使用新的时区处理函数替代. 

2. PHP 5.3 の新機能

1. 支持命名空间 (Namespace) 
2. 支持延迟静态绑定(Late Static Binding) 
3. 支持goto语句 
4. 支持闭包、Lambda/Anonymous函数 
5. 新增两个魔术方法__callStatic()和__invoke() 
6. 新增Nowdoc语法 
7. 在类外也可使用const来定义常量 
8. 三元运算符增加了一个快捷书写方式: 
9. HTTP状态码在200-399范围内均被认为访问成功 
10.支持动态调用静态方法 
11.新增__DIR__魔术变量

1. 名前空間 (ネームスペース) をサポート
ネームスペースが PHP5.3 によってもたらされる最も重要な新機能であることは疑いの余地がありません。名前空間の概念を利用すると、大規模なサイトを開発する際に、異なるパッケージ内のクラス名や変数名の競合を避けながら、柔軟な構造を設計することが容易になります。

PHP5.3 より前では、パッケージを分割する従来の方法は、ディレクトリ名でコード ファイルを分割し、コード内のクラス名はディレクトリを表すためにアンダースコア _ を使用することでした。たとえば
PHP コード

<?php  
class Zend_Db_Table_Select {}  
// 表示当前这个类的文件位于Zend/Db/Table/Select目录下  
?>  


この命名方法は、PEAR、Zend Framework、およびさまざまな PHP プロジェクトで広く使用されています。この方法では、異なるパッケージまたはライブラリ内のクラス名の競合を回避できますが、コードを記述するときは面倒で不器用です。
PHP5.3 では、異なる名前空間を指定するだけで済みます。名前空間の区切り文字はバックスラッシュです。
select.php
PHP コード

<?php  
namespace ZendDbTable;  
class Select {}  
?>  


このようにすることで、他の名前空間に Select という名前のクラスが存在する場合でも、それを呼び出すときにプログラムが競合することはありません。コードの可読性も向上しました。
メソッド
の呼び出し call.php
PHP コード

<?php  
//namespace ZendDb;  
include(&#39;select.php&#39;);  
$s = new ZendDbTableSelect();  
$s->test();  
?>  


2. 遅延静的バインディングをサポート (Late Static Binding)
PHP5 では、クラス内の self キーワードまたは __CLASS__ を通じて現在のクラスを決定または呼び出すことができます。しかし、これをサブクラスで呼び出すと、結果が親クラスになります。親クラスから継承するときに、静的メンバーがすでにバインドされているためです。 例:
PHP コード

<?php  
class A {  
    public static function who() {  
        echo __CLASS__;  
    }  
    public static function test() {  
        self::who();  
    }  
}  
class B extends A {  
    public static function who() {  
         echo __CLASS__;  
    }  
}  
B::test();  
?>  


上記のコードの出力結果は次のとおりです:

これは私たちが期待していたものとは異なります。私たちは当初、サブクラスの対応する結果を取得したいと考えていました。

PHP 5.3.0 では、現在のクラスを参照するための static キーワードが追加され、遅延静的バインディングが実装されます:
PHP コード

<?php  
class A {  
    public static function who() {  
        echo __CLASS__;  
    }  
    public static function test() {  
        static::who(); // 这里实现了延迟的静态绑定  
    }  
}  
class B extends A {  
    public static function who() {  
         echo __CLASS__;  
    }  
}  
  
B::test();  
?>  


上記のコードの出力結果は次のとおりです:
B
3. goto ステートメントをサポート
ほとんどのコンピューター プログラミング言語は、無条件ジャンプ ステートメント goto をサポートしています。プログラムが goto ステートメントを実行すると、goto ステートメント内のラベルで指定されたプログラムの場所にジャンプして実行を継続します。 goto ステートメントはプログラム フローを不明瞭にし、可読性を低下させる可能性がありますが、深くネストされたループや if ステートメントを中断するなど、特定の状況では独自の便利性があります。
PHP コード

<?php  
goto a;  
echo &#39;Foo&#39;;  
a:  
echo &#39;Bar&#39;;  
for($i=0,$j=50; $i<100; $i++) {  
  while($j--) {  
    if($j==17) goto end;  
  }   
}  
echo "i = $i";  
end:  
echo &#39;j hit 17&#39;;  
?>  


4.支持闭包、Lambda/Anonymous函数 
闭包(Closure)函数和Lambda函数的概念来自于函数编程领域。例如JavaScript 是支持闭包和 lambda 函数的最常见语言之一。 

在PHP中,我们也可以通过create_function()在代码运行时创建函数。但有一个问题:创建的函数仅在运行时才被编译,而不与其它代码同时被编译成执行码,因此我们无法使用类似APC这样的执行码缓存来提高代码执行效率。

在PHP5.3中,我们可以使用Lambda/匿名函数来定义一些临时使用(即用即弃型)的函数,以作为array_map()/array_walk()等函数的回调函数。 
Php代码

<?php  
echo preg_replace_callback(&#39;~-([a-z])~&#39;, function ($match) {  
    return strtoupper($match[1]);  
}, &#39;hello-world&#39;);  
// 输出 helloWorld  
$greet = function($name)  
{  
    printf("Hello %srn", $name);  
};  
$greet(&#39;World&#39;);  
$greet(&#39;PHP&#39;);  
//...在某个类中  
$callback =      function ($quantity, $product) use ($tax, &$total)         {  
   $pricePerItem = constant(__CLASS__ . "::PRICE_" .  strtoupper($product));  
   $total += ($pricePerItem * $quantity) * ($tax + 1.0);  
 };  
array_walk($products, $callback);  
?>  


5. 新增两个魔术方法__callStatic()和__invoke() 
PHP中原本有一个魔术方法__call(),当代码调用对象的某个不存在的方法时该魔术方法会被自动调用。新增的__callStatic()方法则只用于静态类方法。当尝试调用类中不存在的静态方法时,__callStatic()魔术方法将被自动调用。 
Php代码

<?php  
class MethodTest {  
    public function __call($name, $arguments) {  
        // 参数 $name 大小写敏感  
        echo "调用对象方法 &#39;$name&#39; "  
             . implode(&#39; -- &#39;, $arguments). "n";  
    }  
  
    /**  PHP 5.3.0 以上版本中本类方法有效  */  
    public static function __callStatic($name, $arguments) {  
        // 参数 $name 大小写敏感  
        echo "调用静态方法 &#39;$name&#39; "  
             . implode(&#39; -- &#39;, $arguments). "n";  
    }  
}  
  
$obj = new MethodTest;  
$obj->runTest(&#39;通过对象调用&#39;);  
  
MethodTest::runTest(&#39;静态调用&#39;);  // As of PHP 5.3.0  
?>  


以上代码执行后输出如下: 
调用对象方法'runTest' –- 通过对象调用调用静态方法'runTest' –- 静态调用 


以函数形式来调用对象时,__invoke()方法将被自动调用。 
Php代码

<?php
class Demo{
        public function __invoke(){
                echo "测试";
        }
}
$demo = new Demo;
$demo();
?>


这样的话,直接用对象名就当函数使用了,调用的是_invoke的方法;
输出
测试


6.新增Nowdoc语法 
用法和Heredoc类似,但使用单引号。Heredoc则需要通过使用双引号来声明。 
Nowdoc中不会做任何变量解析,非常适合于传递一段PHP代码。 
Php代码

<?php  
// Nowdoc 单引号 PHP 5.3之后支持  
$name = &#39;MyName&#39;;  
echo <<<&#39;EOT&#39;  
My name is "$name".  
EOT;  
//上面代码输出 My name is "$name". ((其中变量不被解析)  
// Heredoc不加引号  
echo <<<FOOBAR  
Hello World!  
FOOBAR;  
//或者 双引号 PHP 5.3之后支持  
echo <<<"FOOBAR"  
Hello World!  
FOOBAR;  
?>  


支持通过Heredoc来初始化静态变量、类成员和类常量。 
Php代码

<?php  
// 静态变量  
function foo()  
{  
    static $bar = <<<LABEL  
Nothing in here...  
LABEL;  
}  
  
// 类成员、常量  
class foo  
{  
    const BAR = <<<FOOBAR  
Constant example  
FOOBAR;  
  
    public $baz = <<<FOOBAR  
Property example  
FOOBAR;  
}  
?>  



7. 在类外也可使用const来定义常量 
PHP中定义常量通常是用这种方式: 
Php代码

<?php  
define("CONSTANT", "Hello world.");  
?>  


并且新增了一种常量定义方式: 
Php代码

<?php  
const CONSTANT = &#39;Hello World&#39;;  
?>  


8. 三元运算符增加了一个快捷书写方式 
Php代码

?:  


原本格式为是(expr1) ? (expr2) : (expr3) 
如果expr1结果为True,则返回expr2的结果。 

PHP5.3新增一种书写方式,可以省略中间部分,书写为expr1 ?: expr3 
如果expr1结果为True,则返回expr1的结果 

9. HTTP状态码在200-399范围内均被认为访问成功 
10.支持动态调用静态方法 
Php代码

<?php  
class Test{  
    public static function testgo()  
    {  
         echo "gogo!";  
    }  
}  
$class = &#39;Test&#39;;  
$action = &#39;testgo&#39;;  
$class::$action();  //输出 "gogo!"  
?>  



11. 支持嵌套处理异常(Exception) 
12. 新的垃圾收集器(GC),并默认启用 

结语: 
PHP 5.3是一个有很大改进的PHP版本,但它仍然遵循着PHP的设计原则—强大、易用。 PHP5.3一方面在面向对象开发等方面有所加强,使PHP更合适于进行企业应用开发,另一方面也增加了不少实用的语法特性和新扩展。我们期待着它能够早日稳定,成为WEB开发中的又一个利器。 


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。