
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 !";
読書へ:
1.
6番目のバージョンを逃して7番目に進んだ主な理由2.
画面に文字列を表示するオペレーター3.
三項(条件付き)演算子4.
メジャーバージョンとマイナーバージョンは何ですか?演習2 。 無効なタグを置換
<?% echo "Next step !";
// syntax error, unexpected '%', expecting end of file on line 1
解決策 <?php echo "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:
解決策 <?php if (preg_replace("/PHP([3-6])/", "PHP7", "PHP6")) { echo "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 !";
読書へ:
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 !"; }
読書へ:
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);
読書へ:
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 !";
読書へ:
1.
新しい演算子2.
Null合体演算子3.
シンプルなPHP issetテスト4.
isset()vs empty()vs is_null()演習8 。 NULL値(??)を持つ結合演算子は、特定の場合に値をチェックせず、条件の右側のオペランドを変更します
<?php $_GET['title'] = false;
//
解決策 <?php $_GET['title'] = false; $query = $_GET['title'] ?? '*'; if($query === false) { echo "Next step !"; }
読書へ:
1.
特別な場合演習9 。 NULL値(??)を持つ結合演算子は、特定の場合に値をチェックしません。$ bの値を変更します
<?php $b = false; echo $a ?? $b ?? "Next step !";
//
解決策 <?php $b = null; echo $a ?? $b ?? "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 !";
読書へ:
1.
名前空間(プログラミング)2.
名前空間の概要3.
PHPのネームスペース、説明4.
PHPの名前空間5.
PHP名前空間の簡単な紹介演習11 。 一部のキーワードは、メソッド名で使用できるようになりました(list、foreach、new、..)
<?php class Foo {
// Uncaught Error: Call to undefined method Foo::list() in /tmp/__hoa_FmqgZ0:12 Stack trace:
解決策 <?php class Foo { public function list() { return "Next step !"; } } echo (new Foo)->list();
読書へ:
1.
キーワード演習12 。 より安全な関数を使用して乱数を生成する
<?php $randomInt = mt_rand(0, 42); echo $randomInt;
// 5
解決策 <?php $randomInt = random_int(0, 42); echo $randomInt;
読書へ:
1.
擬似乱数整数を取得するための暗号的に安全な関数2.
mt_randの欠点は何ですか?3.
mt_rand()とrand()の違い演習13 。 新しいpreg_replace_callback_array関数を使用します
<?php
// 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);
読書へ:
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 !"; }
読書へ:
1.
データ型2.
PHPデータ型の概要3.
今日、PHP 7でスカラーおよび混合データ型を使用しても生産性は向上しません演習16 。 デフォルトでは、PHPは期待される型の値をキャストします。 適切な条件オペランドを変更する
<?php function add(int $a, int $b) { return $a + $b; }
//
解決策 <?php function add(int $a, int $b) { return $a + $b; } if(add(5.5, 5.5) === 10) { echo "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:
解決策 <?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 !"; }
読書へ:
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:
解決策 <?php declare(strict_types = 1); strlen('42'); echo "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 !";
読書へ:
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:
解決策 <?php function reverse(string $string): string { return strrev($string); } echo reverse("! pets txeN"); echo "Next step !";
読むには:
1.
返品2.
PHPの戻り値と非戻り値の違いは何ですか?3.
PHPで期待されるタイプの関数を要求すると、パフォーマンスが向上しますか?4.
ユーザー定義のブール関数の戻り値にルールはありますか?演習21 。 デフォルトでは、PHPは期待されるタイプをスローします。 正しい関数の戻り値の型
<?php
//
解決策 <?php function add(float $a, float $b): int { return $a + $b; }
読書へ:
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 !";
読書へ:
1.
ポリモーフィズムよりも継承とメソッドの再定義について少し2.
ポリモーフィズムとは実際には何ですか。 PHPにも存在します2.
サブタイプが親メソッドをオーバーライドする場合、返される子メソッドのタイプは親と完全に一致する必要があります4.
PHPの優れたOOP学習コース演習23 。 Unicodeシーケンスを使用して文字を説明できるようになりました
<?php
//
読書へ:
1.
Unicode2.
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 !"; }
読書へ:
1.
シリアライズ解除2.
PHPでserialize()とunserialize()を使用する方法は?3.
型チェック演算子練習問題25 。 ジェネレーターの委任により、オブジェクト、配列、イテレーター、または別のジェネレーターなど、別の反復可能な構造を返すことができます。 別の発電機を発電機に変える
<?php function generator() { yield 1;
// 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.
ジェネレーターの委任5.
PHPジェネレーターでのリソースのリークについて練習問題26 。 関数でクロージャーを使用できます。 新しい通訳は左から右に機能します
<?php function foo() { return function() { echo "Next step !"; }; }
//
解決策 <?php function foo() { return function() { echo "Next step !"; }; }
読書へ:
1.
無名関数(ラムダ関数)2.
PHPの匿名関数(クロージャー):JavaScriptのクロージャーと混同しないでください3.
PHPでクロージャーを使用する練習問題27 。 $ aから変数$ cを呼び出すように構文を修正します
<?php $a = ['b' => 'c']; $c = 'Next step !';
// Undefined variable: Array on line 7
解決策 <?php $a = ['b' => 'c']; $c = 'Next step !'; echo ${$a['b']};
読書へ:
1.
ユニバーサル構文練習問題28 。 ここで、例外をキャッチするには、Errorクラスを使用する必要があります
<?php try {
// Uncaught Error: Call to undefined function undefinedFunction() in /tmp/__hoa_PaBzqc:4 Stack trace:
解決策 <?php try { undefinedFunction(); } catch(Error $e) { echo "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; }
// 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:
解決策 <?php declare(strict_types = 1); function add(int $a, int $b): int { return $a + $b; }
読書へ:
1.
PHPの例外の種類練習問題30 。 Throwableを使用して、例外とエラー(一般的なインターフェイスエラー、例外)をキャッチします
<?php
// Undefined offset: -1 on line 55
解決策 <?php try { if(random_int(0, 1) === 1) { throw new Exception(''); } undefined(); } catch(Throwable $e) { echo "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:
解決策 <?php try { 10 % 0; } catch(DivisionByZeroError $e) { echo "Next step !"; }
読書へ:
1.
DivisionByZeroError演習32 。 文字列に16進数を使用しないでください
<?php
//
解決策 <?php if(0x2A == 42) { echo "Next step !"; }
読書へ:
1.
PHPでの型キャスト== two-legged stool?2.
型キャスト3.
文字列の16進数のサポートを削除演習33 。 ジェネレータの最終値を明示的に返すことにより、ジェネレータを呼び出すコードで値を直接処理できます
<?php
// Uncaught Error: Call to undefined method Generator::callReturn() in /tmp/__hoa_eOhq2B:14 Stack trace:
解決策 <?php function generator() { yield 21; yield 21; return true; } $generator = generator(); foreach($generator as $number) { } if($generator->getReturn() === true) { echo "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();
読書へ:
1.
ロシア語で単語の収量を言う方法???練習問題35 。 関数プロトタイプで同じ引数名を使用することはできません
<?php function foo($a, $a) { return $a; } echo foo("Next ", "step !");
// Redefinition of parameter $a on line 4
解決策 <?php function foo($a, $b) { return $a . $b; } echo foo("Next ", "step !");
読書へ:
1.
関数の引数練習問題36 。 これで、定数の配列(グループ)を作成できます
<?php $conf = [ 'user' => 'root', 'password' => 'my_password', 'step' => 'Next 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'];
読書へ:
1.
定数2.
「魔法の」定数3.
define()vs const