ホームページ  >  記事  >  バックエンド開発  >  PHP5.2~5.6の新機能、php5.25.6の新機能の詳細説明_PHPチュートリアル

PHP5.2~5.6の新機能、php5.25.6の新機能の詳細説明_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:23:17962ブラウズ

PHP5.2から5.6の新機能、php5.25.6の新機能を詳しく解説

現在 (2014.2) の PHP の最新の安定バージョンは PHP5.5 ですが、ユーザーのほぼ半数が維持されなくなった PHP5.2 を依然として使用しており [注]、残りの半数のユーザーは PHP5 を使用しています。 .3【注意】。 「何百もの学派の長所を集めた」PHP の厄介な構文と、コミュニティの雰囲気の悪さのため、多くの人は新しいバージョンや新機能に興味を持ちません。

この記事では、PHP5.2からPHP5.6で追加された新機能を紹介します。

PHP5.2 より前: 自動ロード、PDO、MySQLi、型制約

PHP5.2: JSON サポート
PHP5.3: 非推奨の機能、匿名関数、新しいマジックメソッド、名前空間、遅延静的バインディング、Heredoc と Nowdoc、const、三項演算子、Phar
PHP5.4: 短いオープンタグ、配列の省略形、トレイト、組み込み Web サーバー、詳細が変更されました
PHP5.5: yield, list() が foreach に使用され、詳細が変更されました
PHP5.6: 定数の強化、変数関数パラメータ、名前空間の強化

注: サポートは 2011 年 1 月に終了しました: http://www.php.net/eol.php

注: http://w3techs.com/technologies/details/pl-php/5/all

PHP5.2以前

(2006年以前)

ちなみに、PHP5.2ですでに登場しているが導入する価値のある機能を紹介しておきます。
オートロード
誰もが __autoload() 関数を知っているかもしれません。この関数が定義されている場合、コード内で未定義のクラスが使用されると、この関数内で対応するクラス実装ファイルを呼び出すことができます。

コードをコピーします コードは次のとおりです:
関数 __autoload($classname) {
require_once("{$classname}.php")
}


しかし、PHP では重複した名前を持つ関数が許可されていないため、このような __autoload() 関数はプロジェクト内に 1 つしか存在できないため、この関数の使用は推奨されなくなりました。ただし、一部のクラス ライブラリを使用する場合、必然的に複数の自動ロード関数が必要になるため、 spl_autoload_register() がそれを置き換えます。

コードをコピーします

コードは次のとおりです: spl_autoload_register(関数($クラス名){
require_once("{$classname}.php")
});



spl_autoload_register() は関数をオートロード関数リストに登録します。未定義のクラスが出現すると、SPL [注] は登録されたオートロード関数を登録とは逆の順序で 1 つずつ呼び出します。つまり、spl_autoload_register() を複数登録できます。オートロード機能
注: SPL: Standard PHP Library、標準 PHP ライブラリは、いくつかの古典的な問題 (データ構造など) を解決するように設計されています。

PDO と MySQLi

つまり、PHP Data Object、PHP データ オブジェクトであり、PHP の新しいデータベース アクセス インターフェイスです。


従来のスタイルによれば、MySQL データベースへのアクセスは次のようになります:

コードをコピーします

コードは次のとおりです: // サーバーに接続し、データベースを選択します
$conn = mysql_connect("localhost", "ユーザー", "パスワード");
mysql_select_db("データベース");

//SQLクエリを実行します
$type = $_POST['type']; $sql = "SELECT * FROM `table` WHERE `type` = {$type}";

$result = mysql_query($sql);

//結果を印刷
while($row = mysql_fetch_array($result, MYSQL_ASSOC))

{

foreach($row as $k => $v)
print "{$k}: {$v}n";
}

// 結果セットを解放し、接続を閉じます
mysql_free_result($result);

mysql_close($conn);




コードをデータベースに依存しないようにするため、つまり、1 つのコードを複数のデータベースに同時に適用できるようにするために (たとえば、上記のコードは MySQL にのみ適用可能です)、PHP は PDO を正式に設計しました。

さらに、PDO は次のような機能も提供します: •オブジェクト指向スタイルのインターフェース

•SQL プリコンパイル (準備)、プレースホルダー構文
•実行効率の向上、公式推奨として、特別なパフォーマンスの最適化があります
•ほとんどの SQL データベースをサポートし、データベースを変更するときにコードを変更する必要はありません

PDO を使用して実装された上記のコードは次のようになります:

コードをコピーします

コードは次のとおりです: // データベースに接続します
$conn = 新しい PDO("mysql:host=localhost;dbname=database", "user", "password");

//SQL をプリコンパイルし、パラメーターをバインドします
$query = $conn->prepare("SELECT * FROM `table` WHERE `type` = :type"); $query->bindParam("type", $_POST['type']);


//クエリを実行し、結果を出力します
foreach($query->execute() as $row)

{

foreach($row as $k => $v)
print "{$k}: {$v}n";
}

PDO は公式に推奨されており、より一般的なデータベース アクセス方法です。特別なニーズがない場合は、PDO を学習して使用することをお勧めします。 ただし、MySQL に固有の高度な機能を使用する必要がある場合は、MySQLi を試してみることをお勧めします。PDO には、複数のデータベースで同時に使用するための MySQL のそれらの固有の機能が含まれていないためです。

MySQLi は MySQL の拡張インターフェイスであり、プロセス指向とオブジェクト指向の両方のインターフェイスを提供します。これは現在推奨されている MySQL ドライバーでもあります。古い C スタイルの MySQL インターフェイスは将来デフォルトで閉じられます。

上記の 2 つのコードと比較すると、MySQLi の使用法には多くの新しい概念はありません。ここでは例を示しません。PHP の公式 Web サイトのドキュメントを参照してください。

注: http://www.php.net/manual/en/mysqli.quickstart.php

型制約

パラメーターの型は型制約によって制限できますが、このメカニズムは現時点ではクラス、呼び出し可能 (実行可能型) および配列 (配列) にのみ適用され、文字列と整数には適用されません。

コードをコピーします コードは次のとおりです:
// 最初のパラメータを MyClass に、2 番目のパラメータを実行可能タイプに、3 番目のパラメータを配列に制限します
関数 MyFunction(MyClass $a, 呼び出し可能 $b, 配列 $c)
{
// ...
}


PHP5.2 (2006-2011)


JSON サポート

json_encode()、json_decode() およびその他の関数を含む JSON は Web 分野で非常に一般的に使用されるデータ交換形式であり、JSON は実際には JS 構文の一部です。

JSON シリーズ関数は、PHP の配列構造を JSON 文字列に変換できます:


コードをコピーします コードは次のとおりです:
$array = array("key" => "value", "array" => array(1, 2, 3, 4));
$json = json_encode($array);
echo "{$json}n";

$object = json_decode($json); print_r($object);


出力:

コードをコピーします コードは次のとおりです:
{"キー":"値","配列":[1,2,3,4]}
stdクラスオブジェクト
(
[キー] => 値
[配列] => 配列
(
[0] => [1] => 2
[2] => 3
[3] => )
)



json_decode() はデフォルトで配列ではなくオブジェクトを返すことに注意してください。配列を返す必要がある場合は、2 番目のパラメーターを true に設定する必要があります。 PHP5.3
(2009-2012)
PHP5.3 は非常に大きなアップデートであり、多くの新機能が追加され、下位互換性のないいくつかの変更も加えられています。


非推奨の機能

以下の機能は非推奨です。設定ファイルで有効にすると、PHP は実行時に警告を発行します。

グローバルを登録する

これは php.ini のオプション (register_globals) で、オンにすると、すべてのフォーム変数 ($_GET および $_POST) がグローバル変数として登録されます。 以下の例を見てください:



コードをコピーします

コードは次のとおりです:

if(isAuth()) $authorized = true; if($authorized) include("page.php");

このコードが検証に合格すると、$authorized を true に設定し、$authorized の値に基づいてページを表示するかどうかを決定します。

ただし、$authorized は事前に false に初期化されていないため、register_globals をオンにすると、/auth.php?authorized=1 にアクセスして変数値を定義し、認証をバイパスすることができます。

この機能は歴史的な問題であり、PHP4.2 ではデフォルトでオフになり、PHP5.4 では削除されました。

魔法の名言

php.ini のオプション magic_quotes_gpc に対応します。この機能も歴史的な問題であり、PHP5.4 で削除されました。

この機能はすべてのユーザー入力をエスケープします。これは、第 1 章でユーザー入力のエスケープについて説明しました。

しかし、PHP は、どの入力が SQL に入力され、どの入力がシェルに入力され、どの入力が HTML として表示されるのかを知らないため、多くの場合、このエスケープが混乱を引き起こします。

セーフモード

多くの Web ホスティング プロバイダーはセーフ モードを使用して複数のユーザーを分離しますが、セーフ モードには多くの問題があります。たとえば、一部の拡張機能はセーフ モードに従ってアクセス許可を制御しません。

PHP は、オペレーティング システムのメカニズムを使用して権限を分離し、Web サーバーが異なるユーザー権限で PHP インタープリタを実行できるようにすることを公式に推奨しています。第 1 章の最小特権の原則を参照してください。
匿名関数

クロージャとも呼ばれ、コールバック関数やその他の目的で名前のない関数を一時的に作成するためによく使用されます。

コードをコピーします コードは次のとおりです:
$func = 関数($arg)
{
$arg;
を印刷します };
$func("Hello World");


上記のコードは匿名関数を定義し、それを $func に割り当てます。 function キーワードは匿名関数の定義に依然として使用されていますが、関数名は省略され、パラメーター リストが直接使用されていることがわかります。


次に、$func に格納されている匿名関数を呼び出します。

匿名関数は use キーワードを使用して外部変数をキャプチャすることもできます:

コードをコピーします コードは次のとおりです:
関数 arrayPlus($array, $num)
{
array_walk($array, function(&$v) use($num){
$v += $num;
});
}


上記のコードは、配列 ($array) 内の各項目に指定された数値 ($num) を追加する arrayPlus() 関数 (これは匿名関数ではありません) を定義します。 arrayPlus() の実装では、array_walk() 関数を使用します。これは、定義した匿名関数である配列の各項目に対してコールバック関数を実行します。

匿名関数のパラメーター リストの後に、use キーワードを使用して匿名関数の外側の $num を関数に取り込み、どれだけ追加する必要があるかを把握します。

マジックメソッド: __invoke()、__callStatic()

PHP のオブジェクト指向システムは、存在しないプロパティやメソッドにアクセスするときにマジック メソッドをトリガーするなど、他の言語と同様の「オーバーロード」を実装するためのいくつかの「マジック メソッド」を提供します。

匿名関数の追加により、PHP は新しいマジック メソッド __invoke() を導入します。
このマジック メソッドは、オブジェクトが関数として呼び出されるときに呼び出されます:


コードをコピーします

コードは次のとおりです: クラスA
{
パブリック関数 __invoke($str)
{
print "A::__invoke(): {$str}";
}
}
$a = 新しい A;
$a("Hello World");



出力は間違いなく次のとおりです:
A::__invoke(): Hello World

__callStatic() は、存在しない静的メソッドを呼び出すときに呼び出されます。
ネームスペース

PHP の名前空間には、前例のない、非常に困難な構文があります:



コードをコピーします

コードは次のとおりです: // 名前空間の区切り文字はバックスラッシュであり、宣言ステートメントはファイルの最初の行になければなりません。
// 名前空間には任意のコードを含めることができますが、**クラス、関数、定数**のみが名前空間の影響を受けます。
名前空間 XXOOTest;
// このクラスの完全修飾名は XXOOTestA で、最初のバックスラッシュはグローバル名前空間を示します。
クラス A{}
// 既存のファイルに 2 番目の名前空間を定義することもでき、残りのコードは OtherTest2 に配置されます。
名前空間 OtherTest2;
// 他の名前空間からオブジェクトをインスタンス化します:
$a = 新しい XXOOTestA;
クラス B{}
// 中括弧を使用して 3 番目の名前空間を定義することもできます
名前空間 その他 {
// サブ名前空間からオブジェクトをインスタンス化します:
$b = 新しい Test2B;
// 他の名前空間から名前をインポートし、名前を変更します。
// インポートできるのはクラスのみであり、関数や定数はインポートできないことに注意してください。
XXOOTestA を ClassA として使用します
}

名前空間の構文の詳細については、公式Webサイト[注意]を参照してください。

名前空間は、クラス実装ファイルを自動的にロードするために autoload と併用されることがよくあります。

コードをコピーします コードは次のとおりです:

spl_autoload_register(
関数 ($class) {
spl_autoload(str_replace("\", "/", $class));
}
);

クラス XXOOTestA をインスタンス化すると、クラスの完全修飾名が autoload 関数に渡され、autoload 関数はクラス名の名前空間区切り文字 (バックスラッシュ) をスラッシュに置き換え、対応するファイルを含めます。
これにより、クラス定義ファイルの階層ストレージとオンデマンドの自動ロードが可能になります。

注: http://www.php.net/manual/zh/ language.namespaces.php
遅延静的バインディング
PHP の OPP メカニズムには、次のコードのような継承と仮想関数のような関数があります。

コードをコピーします コードは次のとおりです:
クラスA
{
パブリック関数 callFuncXXOO()
{
$this->funcXXOO();
を印刷します }
パブリック関数 funcXXOO()
{
return "A::funcXXOO()";
}
}
クラス B は A を拡張します
{
パブリック関数 funcXXOO()
{
return "B::funcXXOO";
}
}
$b = 新しい B;
$b->callFuncXXOO();

出力は次のとおりです:
B::funcXXOO

Aで$this->funcXXOO()を使用すると「仮想関数」の仕組みが反映されており、実際に呼び出されるのはB::funcXXOO()であることがわかります。 ただし、すべての関数を静的関数に変更すると:


コードをコピーします コードは次のとおりです:
クラスA
{
静的パブリック関数 callFuncXXOO()
{
print self::funcXXOO();
}
静的パブリック関数 funcXXOO()
{
return "A::funcXXOO()";
}
}
クラス B は A を拡張します
{
静的パブリック関数 funcXXOO()
{
return "B::funcXXOO";
}
}
$b = 新しい B;
$b->callFuncXXOO();


状況はそれほど楽観的ではありません。出力は次のとおりです: A::funcXXOO()


コードをコピーこれは、self のセマンティクスが元々「現在のクラス」であるため、PHP5.3 では static キーワードに新しい機能が与えられています: late static binding:

コードをコピーします コードは次のとおりです:
クラスA
{
静的パブリック関数 callFuncXXOO()
{
print static::funcXXOO();
}
// ...
}
// ...


これは期待どおりに出力されます: B::funcXXOO


ヒアドキュメントとナウドキュメント

PHP5.3 では、Heredoc と Nowdoc にいくつかの改良が加えられており、どちらも PHP コードに大きな文字列を埋め込むために使用されます。


ヒアドキュメントは二重引用符で囲まれた文字列のように動作します:

コードをコピーします コードは次のとおりです:
$name = "私の名前";
エコー <<<テキスト
私の名前は「{$name}」です。
テキスト;


コピー コード Heredoc は 3 つの左山括弧で始まり、その後に識別子 (TEXT) が続き、同じ上部スペースの識別子で終わります (インデントできません)。

二重引用符で囲まれた文字列と同様に、変数を文字列内に埋め込むことができます。


ヒアドキュメントは関数パラメータとクラスメンバーの初期化にも使用できます:

コードをコピーします コードは次のとおりです:
var_dump(<< ハローワールド
EOD
);
クラスA
{
const xx = << ハローワールド
EOD;
パブリック $oo = <<< ハローワールド
EOD;
}



Nowdoc は一重引用符で囲まれた文字列のように動作し、変数を埋め込むことができません。Heredoc との唯一の違いは、3 つの左山括弧の後の識別子を一重引用符で囲む必要があることです。


コードをコピーします

コードは次のとおりです: $name = "私の名前"; エコー <<<「テキスト」
私の名前は「{$name}」です。
テキスト;

出力:
私の名前は「{$name}」です。

定数を定義するには const を使用します
PHP 5.3 は、グローバル名前空間とクラスの両方で定数を定義するための const の使用をサポートしています。

古いスタイル:
定義("XOOO", "値");

新しいスタイル:

const XXOO = "値";

const 形式は定数にのみ適用され、実行時に評価できる式には適用されません。

コードをコピーします コードは次のとおりです:
// 正解です
const XXOO = 1234;
// エラー
const XXOO = 2 * 617;

三項演算子の省略形

古いスタイル:

echo $a ? $a : "値がありません";

は次のように省略できます:

echo $a ?: "値なし";

つまり、三項演算子の 2 番目の部分が省略された場合、デフォルトで最初の部分が置き換えられます。

ファー
Phar は PHP Archive です。元々は Pear の単なるライブラリでしたが、後に PHP5.3 で C 拡張機能として書き直され、PHP に組み込まれました。
Phar は、複数の .php スクリプト (および他のファイル) を .phar 圧縮ファイル (通常は ZIP 形式) にパッケージ化するために使用されます。
目的は Java の .jar を模倣することです、いえ、目的は PHP アプリケーションの公開をより便利にすることです。電子署名検証などの機能も提供します。

.phar ファイルは、.php ファイルと同じように PHP エンジンによって解釈および実行できます。同時に、次のようなコードを記述して .phar にコードを含める (必須にする) こともできます。

コードをコピーします コードは次のとおりです:
require("xxoo.phar");
require("phar://xxoo.phar/xo/ox.php");


詳しくは公式サイト【注意事項】をご覧ください。

注: http://www.php.net/manual/zh/phar.using.intro.php

PHP5.4

(2012-2013)
短いオープンタグ
Short Open Tag は PHP5.4 以降常に利用可能です。
ここでは、PHP の開始タグと終了タグに関連する問題に焦点を当てます。つまり:

コードをコピーします コードは次のとおりです:
// コード...
?>


通常は上記の形式ですが、さらに省略形もあります:


大丈夫です

と略称:

この略語は Short Open Tag と呼ばれ、PHP5.3 ではデフォルトで有効になり、PHP5.4 では常に使用可能になります。

この省略表現は、HTML に PHP 変数を埋め込む場合に非常に便利です。


純粋な PHP ファイル (クラス実装ファイルなど) の場合、PHP は、開始タグを上部のボックスに記述し、終了タグを省略することを公式に推奨しています。

これにより、PHP ファイル全体が出力のない PHP コードになります。そうしないと、ファイルをインクルードした後にヘッダーと Cookie を設定する際に問題が発生します [注]。


注: ヘッダーと Cookie は、コンテンツが出力される前に送信する必要があります。

配列の略語

これはとても便利な機能ですね!

コードをコピーします コードは次のとおりです:
//独自の配列の書き方
$arr = array("key" => "値", "key2" => "値2");
// 略称
$arr = ["キー" => "値", "キー2" => "値2"];


特徴 いわゆるトレイトは「コンポーネント」であり、継承を置き換えるために使用されるメカニズムです。 PHP では多重継承は不可能ですが、クラスには複数のトレイトを含めることができます。


コードをコピーします コードは次のとおりです:

// トレイトは個別にインスタンス化できず、クラスにのみ含めることができます
特性SayWorld
{
パブリック関数sayHello()
{
エコー「ワールド!」;
}
}
クラスMyHelloWorld
{
//SayWorld のメンバーを含める
SayWorld を使用します;
}
$xxoo = 新しい MyHelloWorld();
// SayHello() 関数は SayWorld コンポーネントからのものです
$xxoo->sayHello();
[コード]

Traits には、複数の特性を含める、競合を解決する、アクセス許可を変更する、関数のエイリアスを設定するなど、多くの魔法の機能もあります。
特性には特性も含まれます。紙面の都合上、詳細は公式ウェブサイトを参照してください。

注: http://www.php.net/manual/zh/ language.oop5.traits.php
内蔵ウェブサーバー
PHP には、5.4 以降、軽量の Web サーバーが組み込まれていますが、同時実行性はサポートされておらず、開発およびデバッグ環境向けに位置付けられています。

開発環境で使用すると確かに非常に便利です。

php -S ローカルホスト:8000

これにより、現在のディレクトリに Web サーバーが確立され、http://localhost:8000/ を通じてアクセスできます。
このうち、localhost はリスニング IP、8000 はリスニング ポートで、自分で変更できます。

多くのアプリケーションでは URL の書き換えが実行されるため、PHP はルーティング スクリプトを設定する機能を提供します。

php -S localhost:8000index.php

このようにして、すべてのリクエストはindex.phpによって処理されます。

ブレークポイントのデバッグに XDebug を使用することもできます。
詳細を修正しました
PHP5.4 では、静的メソッドに動的にアクセスする新しい方法が追加されました:
$func = "funcXXOO";
A::{$func}();

インスタンス化中にクラスメンバーにアクセスする新機能:

(新しい MyClass)->xxoo();

関数戻り配列のメンバー アクセス分析のサポートを追加しました (この書き込みメソッドは以前のバージョンではエラーを報告します):

print func()[0];

PHP5.5
(2013年から)
収量
yield キーワードは、関数がイテレータを返す必要がある場合に値を 1 つずつ返すために使用されます。

[コード]
関数番号10()
{
for($i = 1; $i 収量 $i;
}

この関数の戻り値は配列です:
foreach の list()
ネストされた配列は、list() を使用して foreach で解析できます:

コードをコピーします コードは次のとおりです:

$array = [
[1、2、3]、
[4、5、6]、
];

foreach (リストとしての $array($a, $b, $c))
echo "{$a} {$b} {$c}n";

結果:
1 2 3
4 5 6

詳細を修正しました
mysql 関数の使用は非推奨になりました。PDO または MySQLi を使用することをお勧めします。前の記事を参照してください。
Windows XP はサポートされなくなりました。

MyClass::class を使用して、クラスの完全修飾名 (名前空間を含む) を取得できます。

empty() はパラメータとして式をサポートします。

try-catch 構造は、finally ブロックを追加します。
PHP5.6
定数の改善
定数を定義する場合、以前に定義した定数を使用した計算が許可されます:

コードをコピーします コードは次のとおりです:

const A = 2;
const B = A + 1;

クラスC
{
const STR = "こんにちは";
const STR2 = self::STR + ", world";
}

関数パラメータのデフォルト値として定数を許可します:
関数 func($arg = C::STR2)

より良い可変個引数関数パラメータのためにコードをコピーしてください
func_get_args() の代わりに使用されます

コードをコピーします コードは次のとおりです:

関数 add(...$args)
{
$結果 = 0;
foreach($args as $arg)
$result += $arg;
$result を返します;
}

関数を呼び出すときにコードをコピーし、配列を関数パラメータに展開します。

コードをコピーします コードは次のとおりです:

$arr = [2, 3];
add(1, ...$arr);

//結果は6です

ネームスペース
名前空間は定数と関数をサポートします:

コードをコピーします コードは次のとおりです:

名前空間 NameSpace {
const FOO = 42;
関数 f() { echo __FUNCTION__."n" }
; }
名前空間 {
const NameSpaceFOO;
を使用してください NameSpacef;
関数を使用します echo FOO."n";
f();
}

phpにログインできません。phpバージョン5225/5325/5425/5525が利用できない場合は助けてください

設定されていない場合は、php5.2 から 5.6 へのワンクリック切り替えをサポートする phpstudy 統合パッケージをお試しください。試してみる。写真に示すようにphpstudy

PHP533をインストールするには? PHP533 と PHP525 の違いは何ですか? PHP533 にファイルがあるのはなぜですか (例: 「phpini

実際、これらのバージョンではセキュリティと機能がいくつか改善されています。初めての場合は、php.net からダウンロードして直接インストールしてください。 、インストール前に Web サーバーを閉じると、設定ファイルが自動的に変更されます

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/840646.html技術記事 PHP5.2~5.6の新機能、php5.25.6の新機能を詳しく解説 現時点(2014.2)において、PHPの最新安定版はPHP5.5ですが、まだ半数近くのユーザーが使用しており、メンテナンスされなくなりました [注...
]
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHPで実装した連続操作と連鎖操作の例、PHP連鎖例_PHPチュートリアル次の記事:PHPで実装した連続操作と連鎖操作の例、PHP連鎖例_PHPチュートリアル

関連記事

続きを見る