ホームページ >バックエンド開発 >PHPチュートリアル >PHP5_PHPチュートリアルの新機能・特徴まとめ

PHP5_PHPチュートリアルの新機能・特徴まとめ

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

「何百もの学派の長所を集めた」PHP の厄介な構文と、コミュニティの雰囲気の悪さのため、多くの人は新しいバージョンや新機能に興味を持ちません。この記事では、PHP5.6以降、PHP5.2で追加された新機能を紹介します。 ​ ​

この記事のディレクトリ:
PHP5.2 以前: 自動ロード、PDO および MySQLi、型制約
PHP5.2: JSON サポート
PHP5.3: 非推奨の機能、匿名関数、新しいマジック メソッド、名前空間、遅延静的バインディング、 Heredoc と Nowdoc、const、三項演算子、Phar
PHP5.4: 短いオープンタグ、配列省略形、Traits、組み込み Web サーバー、詳細な変更
PHP5.5: yield、foreach の list()、詳細変更
PHP5 .6: 定数の強化、可変関数パラメーター、名前空間の強化

1. 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() を複数登録できます。自動ロード関数。
注: SPL: 標準 PHP ライブラリ、標準 PHP ライブラリは、いくつかの古典的な問題 (データ構造など) を解決するように設計されています。

PDO と MySQLi
は PHP データ オブジェクトであり、PHP の新しいデータベース アクセス インターフェイスです。
従来のスタイルによれば、MySQL データベースへのアクセスは次のようになります:

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

//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 は、次のような追加の機能も提供します。



1. オブジェクト指向スタイルのインターフェイス

2. SQL のプリコンパイル (準備)、プレースホルダー構文

3. 特別なパフォーマンスの最適化による、より高い実行効率

4. コードの変更は必要ありません。データベース

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

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

$query = $conn->prepare("SELECT * FROM `table` WHERE `type` = :type");$query->bindParam("type", $_POST['type']);

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

{

foreach($row as $k => $v)
}n";
} (編集済み)スクリプト アカデミー www.jbxue.com によって主催されます)

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

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

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

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

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

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

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

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

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

print_r($object);

出力:

コードは次のとおりです。 {"key":"value","array":[1,2,3,4]}stdClass Object
(
[key] => value
[array] => Array
(
=> 1

json_decode() はデフォルトで配列ではなくオブジェクトを返すことに注意してください。配列を返す必要がある場合は、2 番目のパラメーターを true に設定する必要があります。



PHP5.3 (2009-2012)

PHP5.3 は非常に大きなアップデートであり、多くの新機能が追加され、下位互換性のないいくつかの変更も加えられています。

【PHP5.3の非推奨の機能】: 以下の機能は、構成ファイルで有効になっている場合、実行時に警告を発行します。

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

コードは次のとおりです。 if(isAuth()) $authorized = true;if($authorized)
include("page.php");
このコードは検証に合格すると、$authorized を true に設定します。その後、$authorized の値に基づいてページを表示するかどうかを決定します。

ただし、register_globals がオンになっている場合、$authorized は事前に false に初期化されません。 /auth .php?authorized=1 にアクセスして、認証をバイパスする変数値を定義することができます。 この機能は歴史的な問題であり、PHP4.2 ではデフォルトでオフになり、PHP5.4 では削除されました。

魔法の名言


php.ini のオプション magic_quotes_gpc に対応します。この機能も歴史的な問題であり、PHP5.4 で削除されました。
この機能はすべてのユーザー入力をエスケープします。これは、第 1 章でユーザー入力のエスケープについて説明しました。

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

セーフ モード 多くの Web ホスティング プロバイダーはセーフ モードを使用して複数のユーザーを分離しますが、セーフ モードには多くの問題があります。たとえば、一部の拡張機能はセーフ モードに従ってアクセス許可を制御しません。 PHP は、オペレーティング システムのメカニズムを使用して権限を分離し、Web サーバーが異なるユーザー権限で PHP インタープリターを実行できるようにすることを公式に推奨しています。第 1 章の最小特権の原則を参照してください。

【PHP5.3の新規追加と改善点】

匿名関数

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

コードは次のとおりです。 $func = function($arg)

{

print $arg;};

$func("Hello World");
上記のコードは、匿名関数を定義し、それを $func に割り当てます。
匿名関数を定義するために function キーワードが引き続き使用されていることがわかりますが、関数名は省略されており、直接パラメーター リストです。
次に、$func に格納されている匿名関数を呼び出します。
匿名関数は use キーワードを使用して外部変数をキャプチャすることもできます:
コードは次のとおりです。 function 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
{
public function __invoke($ str)



$a = 新しい A;

$a("Hello World");

出力は間違いなく次のとおりです:



コードは次のとおりです。 A::__invoke(): Hello World __callStatic() は、存在しない静的メソッドを呼び出すときに呼び出されます。

名前空間


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

コードは次のとおりです。 // 名前空間の区切り文字はバックスラッシュであり、宣言ステートメントはファイルの最初の行になければなりません。 // 名前空間には任意のコードを含めることができますが、**クラス、関数、定数**のみが名前空間の影響を受けます。 名前空間XXOOTest;


// このクラスの完全修飾名は XXOOTestA で、最初のバックスラッシュはグローバル名前空間を表します。

クラス A{}

// 既存のファイルに 2 番目の名前空間を定義することもできます。次のコードは OtherTest2 に配置されます。
namespace OtherTest2;

// 他の名前空間からオブジェクトをインスタンス化します:
$a = new XXOOTestA;

class B{}


// 中括弧を使用して 3 番目の名前空間を定義することもできます
namespace Other {

// サブ名前空間からオブジェクトをインスタンス化します:

$b = new Test2B;

// 他の名前空間から名前をインポートし、名前を変更します。
// インポートできるのはクラスのみであり、関数や定数はインポートできないことに注意してください。

XXOOTestA を ClassA として使用します

}

名前空間に関する構文の詳細については、公式 Web サイトを参照してください [注]
名前空間は、クラス実装ファイルを自動的にロードするために autoload と併用されることがよくあります。



spl_autoload_register(

function ($class) {

spl_autoload(str_replace("\", "/", $class));
}
);
クラス XXOOTestA をインスタンス化すると、このクラスの完全な修飾名は autoload 関数に渡され、クラス名の名前空間区切り文字 (バックスラッシュ) がスラッシュに置き換えられ、対応するファイルが組み込まれます。
これにより、クラス定義ファイルの階層ストレージとオンデマンドの自動ロードが可能になります。
注: http://www.php.net/manual/zh/ language.namespaces.php


遅い静的バインディング

PHP の OPP メカニズムには、次のコードのような継承と仮想関数のような関数があります。
コードは次のとおりです。 classa

{public function callfuncxoo()classa{

public public function funcxxoo()

class B extends A
{

public function funcXXOO()

{

return "B::funcXXOO";
}
}

$b = 新しい B;

$b->callFuncXXOO();


出力は次のとおりです:
コードは次のとおりです。 B::funcXXOO
Aで$this->funcXXOO()を使用すると、「仮想関数」の仕組みが反映され、実際にはB::funcXXOO()が呼び出されることがわかります
ただし、すべての関数をstatic Functionに変更すると。 :
コードは次のとおりです。 class A
{
static public function callFuncXXOO()
{
print self::funcXXOO();
}

static public function funcXXOO()
{
return "A::funcXXOO()";
}
}

class B は A を拡張します
{
static public function funcXXOO()
{
return "B::funcXXOO";
}
}

$b = 新しい B;
$b->callFuncXXOO();


状況はそれほど楽観的ではありません。出力は次のとおりです:
コードは次のとおりです。 A::funcXXOO()
これは、self のセマンティクスが元々「現在のクラス」であるため、PHP5.3 では static キーワードに新しい関数、late static binding: が与えられています。
コードは次のとおりです。 class A{
static public function callFuncXXOO()
{
print static::funcXXOO();
}

// ...

}

// ...

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

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

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

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

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

コードは次のとおりです。 $name = "MyName";echo <<<テキスト
私の名前は「{$name}」です。
テキスト;
ヒアドキュメントは 3 つの左山括弧で始まり、その後に識別子 (TEXT) が続き、同じ上部スペースの識別子で終わります (インデントはできません)。
二重引用符で囲まれた文字列と同様に、変数をその中に埋め込むことができます。

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

コードは次のとおりです。 var_dump(<<Hello World
EOD
);

クラス A

{
const xx = <<< EOD
Hello World
EOD;

パブリック $oo = <<< EOD

Hello World
EOD;
}

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

コードは次のとおりです。 $name = "MyName";echo <<< 'TEXT'私の名前は「{$name}」です。
TEXT;
出力:


コードは次のとおりです。 私の名前は「{$name}」です。

定数を定義するには const を使用します

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

古いスタイル:


コードは次のとおりです。 定義("XOOO", "値"); 新しいスタイル: const XXOO = "Value";
const 形式は定数にのみ適用され、実行時に評価できる式には適用されません:


コードは次のとおりです。 // 正しいconst XXOO = 1234;// 間違っています
const XXOO = 2 * 617;

三項演算子の短縮形

古いスタイル:

コードは次のとおりです。 echo $a ? $a : "値がありません"; は次のように省略できます:

コードは次のとおりです。 echo $a ?: "値がありません"; つまり、三項演算子の 2 番目の部分が省略された場合、デフォルトで最初の部分が置き換えられます。

ファー

Phar は PHP アーカイブです。元々は 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"); 詳細については、公式Webサイト[注]を参照してください。注: http://www.php.net/manual/zh/phar.using.intro.php



PHP5.4(2012-2013)

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

コードは次のとおりです。 // コード...
?>
通常は上記の形式ですが、さらに省略形もあります:
コードは次のとおりです。
大丈夫です
コードは次のとおりです。
と略称:
コードは次のとおりです。
この略語は Short Open Tag と呼ばれ、PHP5.3 ではデフォルトで有効になり、PHP5.4 では常に使用可能になります。
この短縮形式を使用すると、HTML に PHP 変数を埋め込むのに非常に便利です。

純粋な PHP ファイル (クラス実装ファイルなど) の場合、PHP は、開始タグを上部のボックスに記述し、終了タグを省略することを公式に推奨しています。
これにより、PHP ファイル全体が出力のない PHP コードであることが保証されます。そうしないと、ファイルをインクルードした後にヘッダーと Cookie を設定するときに問題が発生します [注]。

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

配列の略語
とても便利な機能です!

コードは次のとおりです。 //本来の書き方
$arr = array("key" => "value", "key2" => "value2");
// 短縮形
$arr = ["key" => " 値", "キー 2" => "値 2"];

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

コードは次のとおりです。 // トレイトは個別にインスタンス化できず、クラスにのみ含めることができます
trait SayWorld
{
public function SayHello()
{
echo 'World!';
}
}

class MyHelloWorld
{
// SayWorld にメンバーを含める
use SayWorld;
}

$xxoo = new MyHelloWorld();
// SayHello() 関数は SayWorld コンポーネントからのものです
$xxoo->sayHello();


Traits には、複数の特性を含める、競合を解決する、アクセス許可を変更する、関数のエイリアスを設定するなど、多くの魔法の機能もあります。
Traits には Traits も含まれます。詳細については、公式 Web サイト [注] を参照してください。 http://www.php.net/manual/zh/ language.oop5.traits.php

組み込み Web サーバー PHP には、5.4 以降、同時実行性をサポートしていない、開発およびデバッグ環境用に軽量の Web サーバーが組み込まれています。
開発環境で使用すると確かに非常に便利です。

コードは次のとおりです。 php -S ローカルホスト:8000 これにより、現在のディレクトリに Web サーバーが確立され、http://localhost:8000/ を通じてアクセスできます。
Localhost はリスニング IP、8000 はリスニング ポートで、自分で変更できます。

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

コードは次のとおりです。 php -S ローカルホスト:8000 インデックス.php このようにして、すべてのリクエストはindex.phpによって処理されます。
ブレークポイントのデバッグに XDebug を使用することもできます。

詳細変更PHP5.4 では、静的メソッドに動的にアクセスする新しい方法が追加されました:

コードは次のとおりです。 $func = "funcXXOO";A::{$func}();
インスタンス化中にクラスメンバーにアクセスする新機能:

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

コードは次のとおりです。 print func()[0];

PHP5.5(2013以降)

yieldyieldキーワードは、関数がイテレータを返す必要がある場合に値を1つずつ返すために使用されます。

コードは次のとおりです。 関数number10(){
for($i = 1; $i yield $i;
}
この関数の戻り値は配列です:

コードは次のとおりです。 [1、2、3、4、5、6、7、8、9、10] foreach の list()
list() を使用して、foreach のネストされた配列を解析できます:

コードは次のとおりです。 $array = [ [1, 2, 3],
[4, 5, 6],
];

foreach ($array as list($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 = "hello";
const STR2 = self::STR + ", world";
}


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

func_get_args() の代わりに使用される可変個引数関数の引数の改善

コードは次のとおりです。 function add(...$args){
$result = 0;
foreach($args as $arg)
$result += $arg;
return $result;
}
同時に、関数を呼び出すときに、配列を関数パラメータに展開できます:

コードは次のとおりです。 $arr = [2, 3];add(1, ...$arr);
//結果は 6 です

namespacenamespace は定数と関数をサポートします:

コードは次のとおりです。 名前空間 NameSpace { const FOO = 42;
function f() { echo __FUNCTION__."n" }
}

名前空間 {

const NameSpaceFOO を使用します;
関数 NameSpacef を使用します;

echo FOO."n";

f();
}

http://www.bkjia.com/PHPjc/742101.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/742101.html技術記事 PHP の構文が難しく、コミュニティの雰囲気が劣悪なため、多くの人は新しいバージョンや新機能に興味がありません。この記事では、PHP5.2からPHP5.6への追加点を紹介します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。