php7-tutorial.com
このサイトの目的は、PHP 7の革新を発見できるようにすることです。このガイドは、何かを解決するか、間違いを修正するように求められる一連の簡単な演習です。 各演習は、 RFC標準(一連の技術仕様と標準)に準拠しており、簡単な説明が添付されています。
翻訳者から
みなさんこんにちは、マキシム・イワノフ、そして今日、PHP 7の革新についてお話します。ギヨーム・ディーヴァルトは、エクササイズの形で作られた彼のマニュアルで詳しく説明します。 しかし、開始する前に、1つの点に注意します。 このレビューでは、このプログラミング言語に関する完全なガイドは提供しません。最新の最も信頼できる情報については、ここにリンクを残してください。 Josh Lockhart (PHP:The Right Wayガイドラインの著者、Slim Framework開発者)は、この本を書いて初心者を支援し、次のように述べています。 PHP言語に関する信頼できる情報なので、このガイドはこの問題を解決するように設計されています。」 なに? 膨大な量のPHPがインターネット上に散在していることは知っていますが、その多くはすでに古くなっているか、高品質のコードを書くことにつながりません。 この本には、実績のあるリソースへのリンクを含む基本的な関連情報が含まれています。 誰かが興味を持っているなら、これはJavaScriptにもあります 。 演習に戻って始めましょう。
内容
- 演習1:$ phpVersion変数の値を変更する
- 演習2:無効なタグを置き換える
- 演習3:非推奨の機能を置き換える
- 演習4. __construct()のみを使用する
- 演習5.スイッチで不要なデフォルト構成を削除する
- 演習6.宇宙船演算子を使用して、配列を並べ替えます。
- 演習7.結合演算子を使用します。
- 演習8.結合演算子の後に条件を変更する必要があります
- 演習9.ユニオン演算子の操作の$ bの値を変更します
- 演習10:同じプレフィックスを持つ名前空間のグループ化
- 演習11.新しい許可されたキーワードのセットを使用してメソッドの名前を変更する
- 演習12.より安全な機能を使用して、乱数を生成します。
- 演習13.新しいpreg_replace_callback_array関数を使用する
- 演習14.匿名クラスを使用します。
- 演習15.関数の引数に型を指定する
- 演習16.条件の右オペランドを変更して、期待されるタイプの値をキャッチします
- 演習17.関数が間違った型を受け取ったときにエラーをキャッチするには、厳格モードを使用します。
- 演習18.組み込み関数には厳密モードを使用します。
- 演習19. strict_typesディレクティブは最初の行に行く必要があります
- 演習20.関数の戻り値のタイプを指定する
- 演習21.関数の戻り値の型を修正して、期待される型の値をキャッチします。
- 演習22.継承クラスを定義すると、同じタイプの親が返されるはずです
- 練習23.新しいUnicodeシーケンスを使用して、文字を記述します。
- 演習24.オブジェクトをunserialize()関数に渡すことができます
- 演習25.ジェネレーターで別のジェネレーターをオンにする
- 演習26.ロック機能を使用する
- 演習27. $ aから変数$ cを呼び出す
- 演習28. Errorクラスを使用してエラーを処理する
- 演習29. TypeErrorクラスを使用してエラーを処理する
- 演習30. Throwableクラスを使用してエラーを処理する
- 演習31. DivisionByZeroErrorクラスを使用してエラーを処理する
- 演習32.文字列に16進数を使用しないでください
- 演習33.ジェネレーター番号1の最終値を取得する
- 演習34.ジェネレーター番号2の最終値を取得する
- 演習35.プロトタイプ(インターフェース)関数を修正する
- 演習36.定数のグループを作成する
サンドボックス
いくつかの例をテストする場合は、 オンラインインタープリターを使用してください。
演習1 。 $ phpVersion変数の値を変更して、次の演習に進みます
<?php $phpVersion = 6; echo PHP_MAJOR_VERSION === $phpVersion ? "Next step !" : "No !";
// No !
解決策
<?php $phpVersion = 7; echo PHP_MAJOR_VERSION === $phpVersion ? "Next step !" : "No !"; // Next step !
読書へ:
1. 6番目のバージョンを逃して7番目に進んだ主な理由
2. 画面に文字列を表示するオペレーター
3. 三項(条件付き)演算子
4. メジャーバージョンとマイナーバージョンは何ですか?
演習2 。 無効なタグを置換
<?% echo "Next step !";
// syntax error, unexpected '%', expecting end of file on line 1
解決策
<?php echo "Next step !"; // Next step !
読書へ:
1. どの代替PHPタグが削除され、どれが残されましたか?
演習3 。 ereg_replace関数は非推奨です; preg_replaceに置き換えてください
<?php if (ereg_replace("PHP([3-6])", "PHP7", "PHP6")) { echo "Next step !"; }
// Uncaught Error: Call to undefined function ereg_replace() in /tmp/__hoa_6b3Hmf:3 Stack trace: #0 /tmp/__hoa_f8PIGz(52): require() #1 {main} thrown on line 3
解決策
<?php if (preg_replace("/PHP([3-6])/", "PHP7", "PHP6")) { echo "Next step !"; } // Next step !
読書へ:
1.非推奨の拡張機能
2. PHPの正規表現
3. 正規表現による検索と置換
4. テンプレート
5. パフォーマンス
演習4 。 PHP4コンストラクタは非推奨です。__constructを使用してください
<?php class Foo { public function foo() { } } echo "Next step !";
// Methods with the same name as their class will not be constructors in a future version of PHP; Foo has a deprecated constructor on line 3
解決策
<?php class Foo { public function __construct() { } } echo "Next step !"; // Next step !
読書へ:
1. 古いコンストラクタ
2. コンストラクター(オブジェクト指向プログラミング)
3. クラスの目的は何ですか?
4. なぜOOPが必要ですか?
5. オブジェクト指向プログラミング
6. PHPでのOOPの基礎
7. クラスの作成を停止する
8. オブジェクト指向プログラミングの長所と短所
演習5 。 switchステートメントの複数のデフォルト構成が無効になりました。最初に削除します
<?php switch ('') { default: echo "Doesn't pass here ..."; break; default: echo "Next step !"; }
// Switch statements may only contain one default clause on line 7
解決策
<?php switch ('') { default: echo "Next step !"; } // Next step !
読書へ:
1. switchステートメントでいくつかのデフォルトのケースを定義するときに構文エラーがあるのはなぜですか?
2. switchステートメント
演習6 。 宇宙船演算子(<=>)を使用して配列を並べ替えます
<?php $users = ['Pierre', 'Paul', 'Next step !']; usort($users, function ($a, $b) { }); echo current($users);
// Pierre
解決策
<?php $users = ['Pierre', 'Paul', 'Next step !']; usort($users, function ($a, $b) { return $a <=> $b; }); echo current($users); // Next step !
読書へ:
1. 新しい演算子
2. シェーシップ<=>演算子とは何ですか?
3. usort-要素を比較するユーザー定義関数を使用して、値で配列をソートします
4. 内部ポインター
演習7 。 NULL(??)の値で結合演算子を使用します
<?php echo $_GET['query'] ? $_GET['query'] : "Next step !";
// Undefined index: query on line 3
解決策
<?php echo $_GET['query'] ?? "Next step !"; // Next step !
読書へ:
1. 新しい演算子
2. Null合体演算子
3. シンプルなPHP issetテスト
4. isset()vs empty()vs is_null()
演習8 。 NULL値(??)を持つ結合演算子は、特定の場合に値をチェックせず、条件の右側のオペランドを変更します
<?php $_GET['title'] = false; // , $query = $_GET['title'] ?? '*'; // true // if($query === '*') { echo "Next step !"; }
//
解決策
<?php $_GET['title'] = false; $query = $_GET['title'] ?? '*'; if($query === false) { echo "Next step !"; } // Next step !
読書へ:
1. 特別な場合
演習9 。 NULL値(??)を持つ結合演算子は、特定の場合に値をチェックしません。$ bの値を変更します
<?php $b = false; echo $a ?? $b ?? "Next step !";
//
解決策
<?php $b = null; echo $a ?? $b ?? "Next step !"; // Next step !
読書へ:
1. 演算子の例
演習10 。 同じプレフィックスで名前空間をグループ化できます。 例でグループ化します。
<?php use Foo\Bar\Email; use Foo\Bar\Phone; use Foo\Bar\Address\Code; use Foo\Bar\Address\Number; echo "Next step !";
// Next step !
解決策
<?php use Foo\Bar\{ Email, Phone, Address\Code, Address\Number }; echo "Next step !"; // Next step !
読書へ:
1. 名前空間(プログラミング)
2. 名前空間の概要
3. PHPのネームスペース、説明
4. PHPの名前空間
5. PHP名前空間の簡単な紹介
演習11 。 一部のキーワードは、メソッド名で使用できるようになりました(list、foreach、new、..)
<?php class Foo { // public function getList() { return "Next step !"; } } echo (new Foo)->list();
// Uncaught Error: Call to undefined method Foo::list() in /tmp/__hoa_FmqgZ0:12 Stack trace: #0 /tmp/__hoa_LbZpe8(52): require() #1 {main} thrown on line 12
解決策
<?php class Foo { public function list() { return "Next step !"; } } echo (new Foo)->list(); // Next step !
読書へ:
1. キーワード
演習12 。 より安全な関数を使用して乱数を生成する
<?php $randomInt = mt_rand(0, 42); echo $randomInt;
// 5
解決策
<?php $randomInt = random_int(0, 42); echo $randomInt; // 1
読書へ:
1. 擬似乱数整数を取得するための暗号的に安全な関数
2. mt_randの欠点は何ですか?
3. mt_rand()とrand()の違い
演習13 。 新しいpreg_replace_callback_array関数を使用します
<?php // Use preg_replace_callback_array instead of preg_replace_callback echo preg_replace_callback( array( "/PHP6/", "/PHP7/" ), function($matches) { if(strpos($matches[0], 'PHP6') === 0) { return 'Ko !'; } else { return "Next step !"; } }, 'PHP7' );
// Next step !
解決策
<?php // preg_replace_callback_array preg_replace_callback echo preg_replace_callback_array( array( "/PHP6/" => function() { return "Ko !"; }, "/PHP7/" => function() { return "Next step !"; }, ), 'PHP7' ); // Next step !
読書へ:
1. コールバック関数を使用した正規表現の検索と置換
2. preg_replace_callback_arrayを使用する
演習14 。 これで、匿名クラスを作成できます。 MyMessageの代わりに匿名クラスを使用する
<?php class Logger { public static function write(Message $message) { echo $message->getText(); } } interface Message { public function getText(); } class MyMessage implements Message { public function getText() { return "Next step !"; } } Logger::write(new MyMessage());
// Next step !
解決策
<?php class Logger { public static function write(Message $message) { echo $message->getText(); } } interface Message { public function getText(); } $message = (new class() implements Message { public function getText() { return "Next step !"; } }); Logger::write($message); // Next step !
読書へ:
1. オブジェクトインターフェイス
2. PHPのインターフェイスの本質は何ですか?
3. PHPのプログラミングテンプレート「Fluid Interface」。 新鮮な表情
4. 抽象クラス
5. PHPの抽象クラスとインターフェース
6. 抽象クラスとインターフェースの違い
演習15 。 関数の引数を追加するint型を追加します
<?php function add($a, $b) { return $a + $b; } if(add(5.5, 5) === 10) { echo "Next step !"; }
//
解決策
<?php function add(int $a, int $b) { return $a + $b; } if(add(5.5, 5) === 10) { echo "Next step !"; } // Next step !
読書へ:
1. データ型
2. PHPデータ型の概要
3. 今日、PHP 7でスカラーおよび混合データ型を使用しても生産性は向上しません
演習16 。 デフォルトでは、PHPは期待される型の値をキャストします。 適切な条件オペランドを変更する
<?php function add(int $a, int $b) { return $a + $b; } // if(add(5.5, 5.5) === 11) { echo "Next step !"; }
//
解決策
<?php function add(int $a, int $b) { return $a + $b; } if(add(5.5, 5.5) === 10) { echo "Next step !"; } // Next step !
読書へ:
1. PHP 7でのスカラー型の初期化
演習17 。 関数が予期する誤った型を受け取ったときにエラーをキャッチする場合は、厳格モードを使用します。 フロートで修正。
<?php declare(strict_types = 1); function add(int $a, int $b) { return (int)($a + $b); } if(add(5.5, 5.5) === 11) { echo "Next step !"; }
// Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given, called in /tmp/__hoa_FKwVHc on line 10 and defined in /tmp/__hoa_FKwVHc:5 Stack trace: #0 /tmp/__hoa_FKwVHc(10): add(5.5, 5.5) #1 /tmp/__hoa_rejBtd(52): require('/tmp/__hoa_FKwV...') #2 {main} thrown on line 5
解決策
<?php declare(strict_types = 1); function add(float $a, float $b) { return (int)($a + $b); } if(add(5.5, 5.5) === 11) { echo "Next step !"; } // Next step !
読書へ:
1. データ型を使用した操作
2. ディレクティブのインストール
3. 型制御
4. 組み込みディレクティブ
演習18 。 組み込み関数には厳密モードを使用します。
<?php declare(strict_types = 1); strlen(42); echo "Next step !";
// Uncaught TypeError: strlen() expects parameter 1 to be string, integer given in /tmp/__hoa_0HYwi9:3 Stack trace: #0 /tmp/__hoa_CjotyX(52): require() #1 {main} thrown on line 3
解決策
<?php declare(strict_types = 1); strlen('42'); echo "Next step !"; // Next step !
読書へ:
1. 標準機能リファレンス
2. PHPの組み込み関数
3. 組み込みPHP拡張
4. 標準PHPライブラリ(SPL)
演習19 。 Strict_typesディレクティブは最初の行に移動する必要があります
<?php echo "Next step !"; declare(strict_types = 1);
// strict_types declaration must be the very first statement in the script on line 5
解決策
<?php declare(strict_types = 1); echo "Next step !"; // Next step !
読書へ:
1. declareは、コードブロックの実行ディレクティブを設定するために使用されます
演習20 。 これで、関数またはメソッドの戻り値の型を指定できます。 関数の戻り値の型を指定します
<?php function reverse(string $string): type { return strrev($string); } echo reverse("! pets txeN");
// Uncaught TypeError: Return value of reverse() must be an instance of type, string returned in /tmp/__hoa_ZcQkYd:5 Stack trace: #0 /tmp/__hoa_ZcQkYd(8): reverse('! pets txeN') #1 /tmp/__hoa_7JLJ4t(52): require('/tmp/__hoa_ZcQk...') #2 {main} thrown on line 5
解決策
<?php function reverse(string $string): string { return strrev($string); } echo reverse("! pets txeN"); echo "Next step !"; // Next step !
読むには:
1. 返品
2. PHPの戻り値と非戻り値の違いは何ですか?
3. PHPで期待されるタイプの関数を要求すると、パフォーマンスが向上しますか?
4. ユーザー定義のブール関数の戻り値にルールはありますか?
演習21 。 デフォルトでは、PHPは期待されるタイプをスローします。 正しい関数の戻り値の型
<?php // : function foo(): int { return 5.5; } echo foo(); // 5 function add(float $a, float $b): int { return $a + $b; } // if(add(5.3, 5.3) === 10.6) { echo 'Next step !'; }
//
解決策
<?php function add(float $a, float $b): int { return $a + $b; } // Modify the right operand. if(add(5.3, 5.3) === 10) { echo 'Next step !'; } // Next step !
読書へ:
1. リンクで戻る
2. リファレンスガイド
演習22 。 継承されたクラスの定義は、親の同じタイプを返す必要があります
<?php class Child {} class ChildB extends Child {} abstract class A { abstract public function foo(): Child; } class B extends A { public function foo(): ChildB { return new ChildB; } } echo "Next step !";
// Declaration of B::foo(): ChildB must be compatible with A::foo(): Child on line 17
解決策
<?php class Child {} class ChildB extends Child {} abstract class A { abstract public function foo(): Child; } class B extends A { public function foo(): Child { return new ChildB; } } echo "Next step !"; // Next step !
読書へ:
1. ポリモーフィズムよりも継承とメソッドの再定義について少し
2. ポリモーフィズムとは実際には何ですか。 PHPにも存在します
2. サブタイプが親メソッドをオーバーライドする場合、返される子メソッドのタイプは親と完全に一致する必要があります
4. PHPの優れたOOP学習コース
演習23 。 Unicodeシーケンスを使用して文字を説明できるようになりました
<?php // if("\?{26C4}" === '') { echo "Next step !"; }
//
解決策
<?php // Modify the left operand. if("\u{26C4}" === '') { echo "Next step !"; } // Next step !
読書へ:
1. Unicode
2. PHP文字列のUnicode文字
3. エスケープシーケンスのUnicodeサポート
エクササイズ24 。 新しいオプションが標準のunserialize()関数に追加され、クラスを指定できるようになりました。 unserialize()関数でクラスを指定します
<?php class MyClass { } $myClassSerialized = serialize(new MyClass()); $myClass = unserialize( $myClassSerialized, ["allowed_classes" => ['']] ); if($myClass instanceOf MyCLass) { echo "Next step !"; }
//
解決策
<?php class MyClass { } $myClassSerialized = serialize(new MyClass()); $myClass = unserialize( $myClassSerialized, ["allowed_classes" => ['MyClass']] ); if($myClass instanceOf MyCLass) { echo "Next step !"; } // Next step !
読書へ:
1. シリアライズ解除
2. PHPでserialize()とunserialize()を使用する方法は?
3. 型チェック演算子
練習問題25 。 ジェネレーターの委任により、オブジェクト、配列、イテレーター、または別のジェネレーターなど、別の反復可能な構造を返すことができます。 別の発電機を発電機に変える
<?php function generator() { yield 1; // 'yield' « yield 2; // } function subGenerator() { yield 3; yield 4; yield "Next step !"; } $generator = generator(); foreach($generator as $value) { echo $value.PHP_EOL; }
// 1 2
解決策
<?php function generator() { yield 1; yield 2; yield from subGenerator(); } function subGenerator() { yield 3; yield 4; yield "Next step !"; } $generator = generator(); foreach($generator as $value) { echo $value.PHP_EOL; } // 1 2 3 4 Next step !
読書へ:
1. ジェネレーターとコルーチンのサポート:ジェネレーターの本質は、単一の値だけでなく、一連の値を返す関数であることです
2. 動作中のジェネレーター
3. ジェネレーターでメモリを節約する
4. ジェネレーターの委任
5. PHPジェネレーターでのリソースのリークについて
練習問題26 。 関数でクロージャーを使用できます。 新しい通訳は左から右に機能します
<?php function foo() { return function() { echo "Next step !"; }; } // foo
//
解決策
<?php function foo() { return function() { echo "Next step !"; }; } // : $foo = foo(); $foo(); foo()(); // Next step !
読書へ:
1. 無名関数(ラムダ関数)
2. PHPの匿名関数(クロージャー):JavaScriptのクロージャーと混同しないでください
3. PHPでクロージャーを使用する
練習問題27 。 $ aから変数$ cを呼び出すように構文を修正します
<?php $a = ['b' => 'c']; $c = 'Next step !'; // Next step ! PHP5 echo $$a['b'];
// Undefined variable: Array on line 7
解決策
<?php $a = ['b' => 'c']; $c = 'Next step !'; echo ${$a['b']}; // Next step !
読書へ:
1. ユニバーサル構文
練習問題28 。 ここで、例外をキャッチするには、Errorクラスを使用する必要があります
<?php try { // undefinedFunction(); } catch(Exception $e) { echo "Next step !"; }
// Uncaught Error: Call to undefined function undefinedFunction() in /tmp/__hoa_PaBzqc:4 Stack trace: #0 /tmp/__hoa_SQZOZG(52): require() #1 {main} thrown on line 4
解決策
<?php try { undefinedFunction(); } catch(Error $e) { echo "Next step !"; } // Next step !
読書へ:
1. 例外処理
2. なぜ例外処理が必要なのですか?
3. PHPの例外
4. PHP 7でスロー可能な例外とエラー
演習29 。 TypeErrorクラスを使用して例外を処理することもできます。
<?php declare(strict_types = 1); function add(int $a, int $b): int { return $a + $b; } // Catch the TypeError try { echo add('1', '1'); } catch(Exception $e) { echo "Next step !"; }
// Uncaught TypeError: Argument 1 passed to add() must be of the type integer, string given, called in /tmp/__hoa_FvS6wW on line 12 and defined in /tmp/__hoa_FvS6wW:5 Stack trace: #0 /tmp/__hoa_FvS6wW(12): add('1', '1') #1 /tmp/__hoa_kfhSdT(52): require('/tmp/__hoa_FvS6...') #2 {main} thrown on line 5
解決策
<?php declare(strict_types = 1); function add(int $a, int $b): int { return $a + $b; } // Catch the TypeError try { echo add('1', '1'); } catch(TypeError $e) { echo "Next step !"; } // Next step !
読書へ:
1. PHPの例外の種類
練習問題30 。 Throwableを使用して、例外とエラー(一般的なインターフェイスエラー、例外)をキャッチします
<?php // CallErrorAndException try { if(random_int(0, 1) === 1) { throw new Exception(''); } undefined(); } catch(CallErrorAndException $e) { echo "Next step !"; }
// Undefined offset: -1 on line 55
解決策
<?php try { if(random_int(0, 1) === 1) { throw new Exception(''); } undefined(); } catch(Throwable $e) { echo "Next step !"; } // Next step !
読書へ:
1. 例外!=エラー
2. Throwableの使用
3. ゼロ除算の例
演習31 。 ゼロで除算するときにDivisionByZeroErrorを使用します
<?php try { 10 % 0; } catch(CatchError $e) { echo "Next step !"; }
// Uncaught DivisionByZeroError: Modulo by zero in /tmp/__hoa_46SBwZ:5 Stack trace: #0 /tmp/__hoa_UQ8f3n(52): require() #1 {main} thrown on line 5
解決策
<?php try { 10 % 0; } catch(DivisionByZeroError $e) { echo "Next step !"; } // Next step !
読書へ:
1. DivisionByZeroError
演習32 。 文字列に16進数を使用しないでください
<?php // var_dump(12 == "0xC"); // true PHP 5 // var_dump(12 == "0xC"); // false PHP 7 // if('0x2A' == 42) { echo "Next step !"; }
//
解決策
<?php if(0x2A == 42) { echo "Next step !"; } // Next step !
読書へ:
1. PHPでの型キャスト== two-legged stool?
2. 型キャスト
3. 文字列の16進数のサポートを削除
演習33 。 ジェネレータの最終値を明示的に返すことにより、ジェネレータを呼び出すコードで値を直接処理できます
<?php // Generator::getReturn() function generator() { yield 21; yield 21; return true; } $generator = generator(); foreach($generator as $number) { } if($generator->callReturn() === true) { echo "Next step !"; }
// Uncaught Error: Call to undefined method Generator::callReturn() in /tmp/__hoa_eOhq2B:14 Stack trace: #0 /tmp/__hoa_sa29ov(52): require() #1 {main} thrown on line 14
解決策
<?php function generator() { yield 21; yield 21; return true; } $generator = generator(); foreach($generator as $number) { } if($generator->getReturn() === true) { echo "Next step !"; } // Next step !
読書へ:
1. 最終値を返す
演習34 。 内部ポインタがそれを指していない場合、最終値を取得できません
<?php function generator() { yield 21; yield 21; return "Next step !"; } $generator = generator(); $generator->next(); echo $generator->getReturn();
// // caught: Cannot get return value of a generator that hasn't returned
解決策
<?php function generator() { yield 21; yield 21; return "Next step !"; } $generator = generator(); $generator->next(); $generator->next(); echo $generator->getReturn(); // Next step !
読書へ:
1. ロシア語で単語の収量を言う方法???
練習問題35 。 関数プロトタイプで同じ引数名を使用することはできません
<?php function foo($a, $a) { return $a; } echo foo("Next ", "step !"); // PHP5: step !
// Redefinition of parameter $a on line 4
解決策
<?php function foo($a, $b) { return $a . $b; } echo foo("Next ", "step !"); // Next step !
読書へ:
1. 関数の引数
練習問題36 。 これで、定数の配列(グループ)を作成できます
<?php $conf = [ 'user' => 'root', 'password' => 'my_password', 'step' => 'Next step !' ]; // CONFIGURATION echo CONFIGURATION['step'];
// /* * <br /> * <b>Warning</b>: Illegal string offset 'step' in <b>/tmp/__hoa_dBF385</b> on line <b>11</b><br /> */
解決策
<?php $conf = [ 'user' => 'root', 'password' => 'my_password', 'step' => 'Next step !' ]; define('CONFIGURATION', $conf); echo CONFIGURATION['step']; // Next step !
読書へ:
1. 定数
2. 「魔法の」定数
3. define()vs const