この記事を読むと、なぜ国内のPHP環境やThinkPHPがPHP5.3以上を使うのかが分かります。
現在(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: Short Open Tag、配列省略形、Traits、内蔵Webサーバー、詳細な変更点
PHP5.5: yield、foreachのlist()、詳細な変更点
PHP5. 6: 定数の拡張、可変関数パラメーター、名前空間の拡張
注: 2011 年 1 月にサポートを終了しました: http://www.php.net/eol.php 注: http://w3techs.com/テクノロジー/詳細/pl-php/5/all
PHP5.2以前(2006年以前)ところで、すでに登場しているが紹介する価値のあるPHP5.2の機能を紹介します。 autoload __autoload() 関数を定義すると、コード内で未定義のクラスが使用されると関数が呼び出され、この関数に対応するクラス実装ファイルをロードできます。例:
-
function__autoload($classname){
-
require_once (" {$classname}.php" )
-
}
コードをコピー
しかし、PHP では重複した関数名が許可されていないため、このような __autoload() 関数はプロジェクト内に 1 つしか存在できないため、この関数は推奨されなくなりました。ただし、一部のクラス ライブラリを使用する場合、必然的に複数のオートロード関数が必要になるため、 spl_autoload_register() で置き換えます:
-
spl_autoload_register(function($classname)
- {
-
require_once("{$classname}.php")
-
});
コードをコピー
spl_autoload_register() 関数が登録されます未定義のクラスが出現すると、SPL [注] は登録されたオートロード関数を登録とは逆の順序で 1 つずつ呼び出します。これは、spl_autoload_register() を使用して複数のオートロードを登録できることを意味します。
Function.注: SPL: Standard PHP Library、標準 PHP ライブラリは、いくつかの古典的な問題 (データ構造など) を解決するように設計されています。PDO および MySQLiつまり、PHP Data Object、PHP データ オブジェクトであり、PHP の新しいデータベース アクセス インターフェイスです。 従来のスタイルによれば、MySQL データベースへのアクセスは次のようになります:
- // サーバーに接続し、データベースを選択します
-
$conn = mysql_connect() "ローカルホスト" ,"ユーザー","パスワード");
- mysql_select_db("データベース") );
-
- // SQLクエリを実行
- $type = $_POST['type'];
- $sql = "選択 * FROM `table` WHERE `type` = {$type}";
$result -
= mysql_query($sql);
-
-
//結果を出力します
-
while($row = mysql_fetch_array($result, MYSQL_ASSOC ))
-
{
-
foreach($row as $k => $v)
"{$k}:ん」-
; }
-
// 結果セットを解放し、接続を閉じます mysql_free_result-
( $結果
);-
mysql_close ($conn
);-
コードをコピーコードをデータベースに依存しないようにするため、つまり、1 つのコードを同時に複数のデータベースに適用できるようにするために (たとえば、上記のコードは MySQL にのみ適用可能です)、PHP は PDO を正式に設計しました 。さらに、PDO はさらに多くの機能も提供します。例: オブジェクト指向スタイルのインターフェイス ? SQL のプリコンパイル (準備)、公式の推奨事項として、特別なパフォーマンスの最適化があります。 ? サポート ほとんどの SQL データベースでは、データベースを変更するときにコードを変更する必要はありませんPDO で実装された上記のコードは次のようになります://データベースに接続します
-
$conn
- =new PDO("mysql:host=localhost;dbname=database", "user", 「パスワード」 );
- // SQL をプリコンパイルし、パラメーターをバインドします$query
- = $conn->準備します("選択 * FROM `table` WHERE `type` = :type ");$query
- ->bindParam("type", $_POST[ 'type' ]);
// クエリを実行し、結果を出力します-
foreach-
($query- >実行 () as $row ) {
-
foreach
- ($row as$k => $v)
"{$k}: {$v}n"-
; }
- コードをコピーPDOは公式に推奨されており、より一般的なデータベース アクセス方法。特別なニーズがない場合は、PDO を学習して使用することをお勧めします
ただし、MySQL 固有の高度な機能を使用する必要がある場合は、MySQLi を試す必要があるかもしれません。複数のデータベースで同時に使用することはできません。MySQL に固有の機能が含まれます。
MySQLi は MySQL の拡張インターフェイスであり、プロセス指向とオブジェクト指向の両方のインターフェイスを提供します。現在推奨されている MySQL ドライバーでもあります。古い C スタイルの MySQL インターフェイスは将来デフォルトで閉じられます。 上記の 2 つのコードと比較すると、MySQLi の使用法には新しい概念はあまりありません。ここでは例を示しません。PHP の公式 Web サイトのドキュメントを参照してください。 注: http://www.php.net/manual/en/mysqli.quickstart.php
型制約パラメーターの型は型制約によって制限できますが、このメカニズムは現時点ではクラス、呼び出し可能 (実行可能型) および配列 (配列) にのみ適用され、文字列と整数には適用されません。 // 制限事項 最初のパラメータは MyClass、2 番目のパラメータは実行形式、3 番目のパラメータは配列です
-
function-
MyFunction(MyClass $a,) 呼び出し可能 $b,配列 $c)
{-
-
コードをコピーPHP5.
(2006-2011)-
JSON サポート json_encode()、json_decode() およびその他の関数が含まれています。JSON は Web 分野で非常に一般的に使用されるデータ交換形式であり、JSON は実際には JS 構文の部分です。
JSON 一連の関数は、PHP の配列構造を JSON 文字列に変換できます:
$array = array("key"=>- ) 「値」 ", "配列"=> , 3); $json =json_encode ($array);echo "{$json}n"$object = json_decode(
- $ json);print_r( $object);
-
コードをコピー 出力:
「キー」- :
「値」 "-
,"配列":[1,2
,-
3 ,4]}
stdClass オブジェクト
-
() [キー]=>値 [ar]レイ]=>
- 配列
-
- 1 ~ ))
-
コードをコピー json_decode() はデフォルトで配列ではなくオブジェクトを返すことに注意してください。配列を返す必要がある場合は、2 番目のパラメーターを true に設定する必要があります。PHP5.3(2009-2012)PHP5.3 は非常に大きなアップデートであり、多くの新機能が追加され、下位互換性のないいくつかの変更も加えられています。 非推奨の機能以下の機能は、構成ファイルで有効になっている場合、実行時に警告を発行します。 グローバルの登録これは php.ini (register_globals) のオプションです。オンにすると、すべてのフォーム変数 ($_GET および $_POST) がグローバル変数として登録されます。以下の例を見てください。
if-
(isAuth())
$authorized -
= true;
- if ($承認されました)
include-
("page.php");
コードをコピー このコードが検証に合格すると、$authorized が true に設定され、それに基づいて表示するかどうかが決定されます。 $authorized Page の値
ただし、$authorized は事前に false に初期化されていないため、register_globals がオンになっている場合、/auth.php?authorized=1 にアクセスして変数値を定義し、認証をバイパスすることができます。 。 この機能は歴史的な問題であり、PHP4.2 ではデフォルトでオフになり、PHP5.4 では削除されました。 Magic Quotesは、php.iniのオプションmagic_quotes_gpcに対応します。この機能も歴史的な問題であり、PHP5.4で削除されました。 この機能はすべてのユーザー入力をエスケープします。第 1 章で、ユーザー入力のエスケープについて説明しました。 しかし、PHP はどの入力が SQL に入力され、どの入力がシェルに入力され、どの入力が HTML として表示されるのかを知らないため、このエスケープが混乱を引き起こすことがよくあります。 セーフ モード 多くの Web ホスティング プロバイダーは複数のユーザーを分離するためにセーフ モードを使用していますが、セーフ モードには多くの問題があります。たとえば、一部の拡張機能はセーフ モードに従ってアクセス許可を制御しません。 PHP は、オペレーティング システムのメカニズムを使用して権限を分離し、Web サーバーが異なるユーザー権限で PHP インタープリターを実行できるようにすることを公式に推奨しています。第 1 章の最小特権の原則を参照してください。 匿名関数 クロージャとも呼ばれ、コールバック関数やその他の目的で名前のない関数を一時的に作成するためによく使用されます。
-
$func = function($arg)
-
{
-
print $arg;
-
};
-
$func("Hello World");
上記のコードは匿名関数を定義し、それを $ に割り当てます機能。
匿名関数を定義するために function キーワードが引き続き使用されていることがわかりますが、関数名は省略され、パラメーター リストが直接使用されています。 次に、$func に格納されている匿名関数を呼び出します。 匿名関数は、 use キーワードを使用して外部変数をキャプチャすることもできます: function
- arrayPlus($array,$num)
- { array_walk
- ($array, function(&$v) use ( $num){ $v
- += $num;
- });
- }
コードをコピー
上記コードは arrayPlus() 関数を定義します (これはは匿名関数ではありません)、配列 ($array) 内の各項目を指定された番号 ($num) に追加します。
arrayPlus() の実装では、array_walk() 関数を使用します。配列の各項目に対するコールバック関数。これは定義した匿名関数です。 匿名関数のパラメーター リストの後に、use キーワードを使用して匿名関数の外側の $num を関数に取り込み、どれだけ追加する必要があるかを把握します。 マジックメソッド: __invoke()、__callStatic()PHP のオブジェクト指向システムは、存在しないプロパティやメソッドにアクセスするときにマジック メソッドをトリガーするなど、他の言語と同様の「オーバーロード」を実装するためのいくつかの「マジック メソッド」を提供します。 {
- public
- function__invoke(
- $str) { 印刷
- "A::__invoke(): {$str}";
- =新しい A;$a
- (「Hello World」 );
-
コードをコピーします
- 出力は間違いなく次のようになります:
- A :: __invoke():こんにちは
- 世界 コードをコピー__callStatic()は、存在しない静的メソッドが呼び出されたときに呼び出されます。
NamespacePHP の名前空間には、前例のない非常に困難な構文があります:
- php// 名前空間の区切り文字はバックスラッシュであり、宣言ステートメントは次のようにする必要があります。ファイルの最初の行に。 // 名前空間には任意のコードを含めることができますが、名前空間の影響を受けるのは **クラス、関数、定数** のみです。
namespace XXOOTest
;- // このクラスの完全修飾名は XXOOTestA で、最初のバックスラッシュはグローバル名前空間を示します。
- class A
- {}
- /// 既存のファイルに 2 番目の名前空間を定義することもでき、次のコードは OtherTest2 に配置されます。
- namespace
- OtherTest2;
- // 他の名前空間からオブジェクトをインスタンス化します:
- $a
- = 次のこともできます中括弧は 3 番目の名前空間を定義します
- namespace Other {
-
// サブ名前空間からオブジェクトをインスタンス化します。 - $b =
- newTest2 B;
- // 他の名前空間から名前をインポートし、名前を変更します // クラスのみが使用できることに注意してください関数ではなくインポートされるそして定数。
-
use- XXOOTestA を
- ClassA }
- 名前空間の構文の詳細については、公式 Web サイト [注] を参照してください。名前空間は、クラス実装ファイルを自動的にロードするために autoload と併用されることがよくあります:
- spl_autoload_register(
- ) 関数($class){
- "\", "/", $クラス)); estA、このクラスの完全修飾名。autoload 関数に渡され、クラス名の名前空間区切り文字 (バックスラッシュ) がスラッシュに置き換えられ、対応するファイルが組み込まれます。 これにより、クラス定義ファイルの階層ストレージとオンデマンドの自動ロードが可能になります。
- 注: http://www.php.net/manual/zh/ language.namespaces.php
後期静的バインディング
PHP の OPP メカニズムには、次のコードのような継承と仮想関数のような関数があります。 - {
print
$this-> funcXXOO(); } -
-
パブリック
関数-
funcXXOO() {
-
return
"A::funcXXOO()"-
; }
} -
-
クラス-
A {
-
パブリック
関数-
funcXXOO()「B:: funcXXOO" ;
-
新しい
B-
;
$b- ->
call FuncXXOO-
();コピー コードの出力は次のとおりです:
-
B::
fうんXXOO-
コードをコピーしてくださいAで$this->funcXXOO()を使用すると「仮想関数」の仕組みが反映され、実際にB::funcXXOO()が呼び出されることがわかりますただし、すべての関数が変更されると静的関数:
-
classA
-
{
-
callFuncXXOO() {
-
静的-
public function funcXXOO()
"A::funcXXOO();-
}" -
} classbextendsa
-
}
-
$b = 新しい
B-
;
$b- ->callFuncXXOO
();-
- コードをコピー 状況はうまくいくでしょう とても楽観的なので、出力は次のようになります: A::
funcXXOO-
()
- コードをコピー これは、 self のセマンティクスは元々「現在のクラス」であるため、PHP5.3 static キーワードに新しい関数が与えられます: late static binding: class function callFuncXXOO ()
-
{
-
(); }
-
- //…
- }
-
// …コードをコピー
- すると期待どおりになります 出力: B::funcXXOO
コードをコピー
そしてNowdoc- PHP5.3 Heredoc と Nowdoc にいくつかの改良が加えられました。どちらも PHP コードに大きな文字列を埋め込むために使用されます。 ヒアドキュメントは二重引用符で囲まれた文字列のように動作します: $name
=
"MyName";
-
echo <<
- テキスト
- 私のの名前はです "{$name}".テキスト;
- コードをコピー
ヒアドキュメントは 3 つの左山括弧で始まり、その後に識別子 (TEXT) が続き、同じ上部スペースの識別子で終わります (インデントはできません)。 二重引用符で囲まれた文字列と同様に、変数を埋め込むことができます。 ヒアドキュメントは関数パラメータとクラスメンバーの初期化にも使用できます: - var_dump(<<<EOD
- Hello 世界
- EOD
- );
- クラス
- constxx=
- << " 公開 $oo = <<<EOD
- 世界;
コードをコピー- Nowdoc は単一の引用符で囲まれた文字列ではできないように動作しますHeredoc との唯一の違いは、3 つの左山括弧の後の識別子を一重引用符で囲む必要があることです: =
- "MyName"
- ; echo << "{$name}". TEXT
;- 出力:
- 名前はです"{$name}"
- .
コードをコピー
const を使用して定数を定義する
PHP 5.3 以降では、グローバル名前空間とクラスの両方で const を使用した定数の定義がサポートされます。 - 古いスタイル: define("XOOO",
- "Value");
コピーコード - 新しいスタイル: constXXOO = "Value"
- ;
コードをコピー
const形式は定数にのみ適用され、実行時に評価できる式には適用されません:
//正しい- constXXOO=1234
;
//間違っています const- XXOO=2 * 617
;
コードをコピー- 三項演算子の短縮形古いスタイル: echo $a ? $a :
「値がありません」
;- コードをコピー
は次のように省略できます: - echo $a ?: "No Value";
コードをコピー
項演算子は省略すると、デフォルトでは最初の部分が代わりに使用されます。 PharPhar は、元々は Pear の単なるライブラリでしたが、後に PHP5.3 で C 拡張機能として書き直され、PHP に組み込まれました。 Phar は、複数の .php スクリプト (他のファイルもパッケージ化できます) を .phar 圧縮ファイル (通常は ZIP 形式) にパッケージ化するために使用されます。 目的はJavaの.jarを模倣すること、いえ、目的はPHPアプリケーションの公開をより便利にすることです。電子署名検証などの機能も提供します。 .phar ファイルは、.php ファイルと同じように PHP エンジンによって解釈および実行できます。同時に、次のようなコードを記述して .phar にコードをインクルード (必須) することもできます: - require ( "xxoo.phar" ); 詳細については、公式 Web サイト [注意] を参照してください。
- 注: http://www.php.net/manual/zh/phar。 using.intro.php
PHP5.4(2012-2013)短いオープンタグ短いオープンタグはPHP5.4以降常に利用可能です。
ここでは、PHP の開始タグと終了タグに関連する問題に焦点を当てます。つまり:
php // コード... ?>
- コードをコピー 通常は上記のフォームを除きますさらに、省略形もあります:
-
/* Code... */- ?>
コードをコピー
を入れることもできます -
php echo $xxoo;?>コードをコピー
の略称:
= $xxうー- ;?> ; コードをコピー
この略語は Short Open Tag と呼ばれ、PHP5.3 ではデフォルトで有効になり、PHP5.4 では常に使用可能になります。 この短縮形式を使用すると、HTML に PHP 変数を埋め込むのに非常に便利です。 純粋な PHP ファイル (クラス実装ファイルなど) の場合、PHP は、開始タグを上部のボックスに記述し、終了タグを省略することを公式に推奨しています。 これにより、PHP ファイル全体が出力のない PHP コードになります。そうしないと、ファイルをインクルードするときにヘッダーと Cookie を設定するときに問題が発生します [注]。注: ヘッダーと Cookie は必須です何かが出力される前に送信されます。 配列の略語とても便利な機能です! - //元の配列の書き込み
- $arr = array("key" =>"value" 、 "key2" => ["key "
- => ];
- コードをコピー 特徴 いわゆるトレイトは「コンポーネント」です、これは継承を置き換えるために使用されるメカニズムです。 PHP では多重継承は不可能ですが、クラスには複数のトレイトを含めることができます。// トレイトは個別にインスタンス化できず、クラスにのみ含めることができますtrait SayWorld{ public functionsayHello
()
echo
'World!';-
} }-
- class MyHelloWorld
{-
//SayWorldのメンバーを含める- 使用
- SayWorld;
- }
- $xxoo MyHelloWorld();
- // SayHello() 関数は SayWorld コンポーネントからのものです
$xxoo- -> sayHello
();- コードをコピートレイトには、複数のトレイトを含める、競合を解決する、アクセス許可を変更する、関数のエイリアスを設定するなど、多くの魔法の機能もあります。 Traits には Traits も含めることができます。スペースに限りがあるため、詳細については公式 Web サイトを参照してください [注]。
http://www.php. net/manual/zh/ language.oop5.traits .php
- 内蔵WebサーバーPHP には 5.4 以降、軽量の Web サーバーが組み込まれていますが、これは同時実行をサポートしておらず、開発およびデバッグ環境向けに位置付けられています。 開発環境で使用すると確かにとても便利です。
- php -S localhost:8000
これにより、現在のディレクトリに Web サーバーが確立されます。 http://localhost:8000 を渡すことができます。 / 訪問する。
ここで、localhost はリスニング IP、8000 はリスニング ポートで、これは自分で変更できます。 多くのアプリケーションでは URL の書き換えが実行されるため、PHP にはルーティング スクリプトを設定する関数が用意されています。 php - コードをコピーしますこのようにして、すべてのリクエストはindex.phpによって処理されます。 ブレークポイントのデバッグに XDebug を使用することもできます。 詳細変更PHP5.4 では、静的メソッドに動的にアクセスする新しい方法が追加されました: $func
=
"funcXXOO"
;A ::{ $func}();- コードをコピーインスタンス化中にクラスメンバーにアクセスするための新機能:
(- new MyClass)->
xxoo
();
コードをコピー-
関数戻り配列のメンバーアクセス分析のサポートを追加しました(この書き込みメソッドは以前のバージョンではエラーを報告します): print func ()[ 0];
コードをコピー
PHP5.5(2013年以降)-
yieldyieldキーワードは、関数が反復子を返す必要がある場合に使用され、値を1つずつ返します。 1つ。 関数number10
()
{ =
- 1; $私は <=
-
10;
- $i +=1) $i;} コードをコピーこの関数の戻り値は次のとおりです配列: list() は foreach に使用されますforeach で入れ子になった配列を解析するには list() を使用できます。
2-
、 3]、
-
]、 ]; foreach
-
($配列asリスト($a,$b,$c
))-
エコー
3
-
4 56 コードをコピー詳細変更mysql関数の使用はお勧めしません。PDOまたはMySQLiの使用をお勧めします。上記を参照してください。 Windows XP はサポートされなくなりました。 MyClass::class を使用して、クラスの完全修飾名 (名前空間を含む) を取得できます。
- empty() はパラメータとして式をサポートします。 新しいfinallyブロックがtry-catch構造に追加されました。 PHP5.6
より良い定数定数を定義するとき、計算に以前に定義した定数を使用できます:
const
- A = 2;
- 定数 B = A +
1;
クラス C {const STR =-
「こんにちは」; ::STR
- + "、世界 ";" }コードをコピーします
- 関数パラメータのデフォルト値として定数を許可します:
- function func( $arg
- = C ::
- STR2) コピーコード可変引数関数パラメータの改善func_get_args() の置き換えに使用されます
-
function add(...$args)
-
{
-
$res ult =0 ;
-
+= $arg; return $result
- ; }
-
コードをコピーしてください同時に、関数を呼び出すときに、配列を関数パラメータに展開できます: $arr
- = [
2,
3
- ]; add(1, ... $arr);
-
//結果は6です コードをコピー 名前空間 名前空間は定数と関数をサポートします:
- namespace Name
Space {
const
- FOO = 42;
- エコー__FUNCTION__."n"; }
-
} 名前空間 use const 名前
SpaceFOO-
; "n"
; f- ();}
-
以上、PHP52から56の新機能について、関連内容も含めて詳しく解説しましたので、PHPチュートリアルに興味のある方の参考になれば幸いです。