Php7-quick-guide

提供:Dev Guides
移動先:案内検索

PHP 7-はじめに

PHP 7とは何ですか?

PHP 7は、PHPプログラミング言語のメジャーリリースであり、Webアプリケーションを開発してモバイル向けに企業やクラウドに配信する方法に革命をもたらすと宣伝されています。 このリリースは、2004年のPHP 5のリリース後、PHPにとって最も重要な変更と見なされます。

新機能

PHP 7には多数の機能が追加されており、最も重要な機能については以下で説明します-

  • パフォーマンスの向上-PHP7でPHPNGコードがマージされたため、PHP 5の2倍の速度です。
  • 低メモリ消費-最適化されたPHP 7は、より少ないリソースを使用します。
  • スカラー型宣言-パラメータと戻り値の型を強制できるようになりました。
  • 一貫した64ビットサポート-64ビットアーキテクチャマシンの一貫したサポート。
  • 例外階層の改善-例外階層が改善されました。
  • 例外に変換された多くの致命的なエラー-例外として変換された多くの致命的なエラーをカバーする例外の範囲が拡大されました。
  • セキュアな乱数ジェネレータ-新しいセキュアな乱数ジェネレータAPIの追加。
  • 廃止されたSAPIおよび拡張機能は削除されました-さまざまな古いSAPIおよび拡張機能が最新バージョンから削除されました。
  • * null合体演算子(??)*-新しいnull合体演算子が追加されました。
  • 戻り値とスカラー型の宣言-戻り値の型とパラメーターの型のサポートが追加されました。
  • 匿名クラス-匿名のサポートが追加されました。
  • ゼロコストアサート-ゼロコストアサートのサポートが追加されました。

PHP 7は、新しいZend Engine 3.0を使用して、アプリケーションのパフォーマンスをほぼ2倍に改善し、PHP 5.6よりもメモリ消費を50%改善しました。 追加のハードウェアを必要とせずにより多くの同時ユーザーにサービスを提供できます。 PHP 7は、今日のワークロードを考慮して設計およびリファクタリングされています。

PHP 7-パフォーマンス

Zendチームによると、次の図は、人気のあるPHPベースのアプリケーションでのPHP 7とPHP 5.6およびHHVM 3.7のパフォーマンス比較を示しています。

Magento 1.9

PHP 7は、Magentoトランザクションの実行中にPHP 5.6に比べて2倍以上高速です。

マゼンタ取引

Drupal 7

PHP 7は、Drupalトランザクションの実行中にPHP 5.6に比べて2倍以上高速です。

Drupal Transactions

Wordpress 3.6

PHP 7は、Wordpressトランザクションの実行中に、PHP 5.6に比べて2倍以上高速です。

Wordpressトランザクション

動的言語の比較

マンデルブロ取引

PHP 7-環境設定

'__ === オンラインで試す

PHPプログラミング環境をオンラインで設定したため、利用可能なすべてのサンプルをオンラインでコンパイルして実行できます。 読んでいるものに自信を与え、さまざまなオプションでプログラムを検証することができます。 サンプルを自由に変更して、オンラインで実行してください。

CodingGround。から入手できるオンラインコンパイラを使用して、次の例を試してください。

<html>
   <head>
      <title>Online PHP Script Execution</title>
   </head>
   <body>
      <?php
         echo "<h1>Hello, PHP!</h1>";
      ?>
   </body>
</html>

このチュートリアルのほとんどの例では、オンラインコンパイラにアクセスできる右上隅のWebサイトコードセクションに Try it オプションがあります。 だからあなたの学習を使って楽しんでください。 '__

PHP Webページを開発して実行するには、コンピューターシステムに3つの重要なコンポーネントをインストールする必要があります。

  • * Webサーバー*-PHPは、MicrosoftのInternet Information Server(IIS)を含むほぼすべてのWebサーバーソフトウェアで動作しますが、最もよく使用されるのはApacheサーバーです。 ここから無料でApacheをダウンロードします-http://httpd.apache.org/download.cgi
  • データベース-PHP PHPは、OracleおよびSybaseを含むほぼすべてのデータベースソフトウェアで動作しますが、最も一般的に使用されるのはMySQLデータベースです。 MySQLをここから無料でダウンロード-http://www.mysql.com/downloads/
  • PHP Parser -PHPスクリプト命令を処理するには、パーサーをインストールして、Webブラウザーに送信できるHTML出力を生成する必要があります。 このチュートリアルでは、コンピューターにPHPパーサーをインストールする方法を説明します。

PHPパーサーのインストール

先に進む前に、PHPを使用してWebプログラムを開発するために、マシンに適切な環境設定があることを確認することが重要です。 次のphpファイルをApacheのhtdocsフォルダーに保存します。

phpinfo.php

<?php
   phpinfo();
?>

ブラウザのアドレスボックスに次のアドレスを入力します。

http://127.0.0.1/phpinfo.php

これにより、PHPインストール関連情報を示すページが表示される場合、PHPとWebサーバーが適切にインストールされていることを意味します。 それ以外の場合は、指定された手順に従ってコンピューターにPHPをインストールする必要があります。

このセクションでは、次の4つのプラットフォームでPHPをインストールおよび構成する方法を説明します-

  • link:/php7/php7_installation_linux [Apacheを使用したLinuxまたはUnixへのPHPインストール]
  • link:/php7/php7_installation_mac [Apacheを使用したMac OS XでのPHPインストール]
  • link:/php7/php7_installation_windows_iis [IISを使用したWindows NT/2000/XPへのPHPインストール]
  • link:/php7/php7_installation_windows_apache [Apacheを使用したWindows NT/2000/XPへのPHPインストール]

Apache設定

WebサーバーとしてApacheを使用している場合、このセクションではApache構成ファイルを編集する方法を説明します。

ここをチェック-リンク:/php7/php7_apache_configuration [ApacheサーバーのPHP設定]

PHP.INIファイルの構成

PHP構成ファイル php.ini は、PHPの機能に影響を与える最後の方法です。

ここをチェック-リンク:/php7/php7_ini_configuration [PHP.INIファイルの構成]

Windows IISの構成

WindowsマシンでIISを構成するには、IISに付属のIISリファレンスマニュアルを参照してください。

PHP 7-スカラー型宣言

PHP 7では、新しい機能であるスカラー型宣言が導入されました。 スカラー型宣言には2つのオプションがあります-

  • coercive -強制はデフォルトモードであり、指定する必要はありません。
  • strict -strictモードは明示的に暗示する必要があります。

上記のモードを使用して、関数パラメータの次のタイプを実施できます-

  • int
  • 浮く
  • bool
  • ひも
  • インターフェース
  • アレイ
  • 呼び出し可能

例-強制モード

<?php
  //Coercive mode
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>

次のブラウザ出力を生成します-

9

例-厳格モード

<?php
  //Strict mode
   declare(strict_types=1);
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>

次のブラウザ出力を生成します-

Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ...

PHP 7-型宣言を返す

PHP 7では、新しい機能* Return型宣言*が導入されました。 戻り値の型宣言は、関数が返す値の型を指定します。 戻り型の次の型を宣言できます。

  • int
  • 浮く
  • bool
  • ひも
  • インターフェース
  • アレイ
  • 呼び出し可能

例-有効な戻りタイプ

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value;
   }
   print(returnIntValue(5));
?>

次のブラウザ出力を生成します-

5

例-無効な戻りタイプ

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value + 1.0;
   }
   print(returnIntValue(5));
?>

次のブラウザ出力を生成します-

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...

PHP 7-ヌル合体演算子

PHP 7では、* null合体演算子(??)という新機能が導入されました。 isset()関数とともに *ternary 操作を置き換えるために使用されます。 Null 合体演算子は、最初のオペランドが存在し、NULLでない場合、それを返します。それ以外の場合は、2番目のオペランドを返します。

<?php
  //fetch the value of $_GET['user'] and returns 'not passed'
  //if username is not passed
   $username = $_GET['username'] ?? 'not passed';
   print($username);
   print("<br/>");

  //Equivalent code using ternary operator
   $username = isset($_GET['username']) ? $_GET['username'] : 'not passed';
   print($username);
   print("<br/>");
  //Chaining ?? operation
   $username = $_GET['username'] ?? $_POST['username'] ?? 'not passed';
   print($username);
?>

次のブラウザ出力を生成します-

not passed
not passed
not passed

PHP 7-宇宙船オペレーター

PHP 7では、新機能である宇宙船オペレーターが導入されました。 2つの式を比較するために使用されます。 最初の式がそれぞれ2番目の式よりも小さい、等しい、または大きい場合、-1、0、または1を返します。

<?php
  //integer comparison
   print( 1 <=> 1);print("<br/>");
   print( 1 <=> 2);print("<br/>");
   print( 2 <=> 1);print("<br/>");
   print("<br/>");
  //float comparison
   print( 1.5 <=> 1.5);print("<br/>");
   print( 1.5 <=> 2.5);print("<br/>");
   print( 2.5 <=> 1.5);print("<br/>");
   print("<br/>");
  //string comparison
   print( "a" <=> "a");print("<br/>");
   print( "a" <=> "b");print("<br/>");
   print( "b" <=> "a");print("<br/>");
?>

次のブラウザ出力を生成します-

0
-1
1

0
-1
1

0
-1
1

PHP 7-定数配列

  • define()関数を使用して配列定数を定義できるようになりました。 PHP 5.6では、 *const キーワードを使用してのみ定義できました。

<?php
  //define a array using define function
   define('animals', [
      'dog',
      'cat',
      'bird'
   ]);
   print(animals[1]);
?>

次のブラウザ出力を生成します-

cat

PHP 7-匿名クラス

新しいクラスを使用して、匿名クラスを定義できるようになりました。 完全なクラス定義の代わりに匿名クラスを使用できます。

<?php
   interface Logger {
      public function log(string $msg);
   }

   class Application {
      private $logger;

      public function getLogger(): Logger {
         return $this->logger;
      }

      public function setLogger(Logger $logger) {
         $this->logger = $logger;
      }
   }

   $app = new Application;
   $app->setLogger(new class implements Logger {
      public function log(string $msg) {
         print($msg);
      }
   });

   $app->getLogger()->log("My first Log Message");
?>

次のブラウザ出力を生成します-

My first Log Message

PHP 7-Closure :: call()

  • Closure :: call()メソッドは、オブジェクトスコープを一時的にクロージャーにバインドして呼び出す簡易的な方法として追加されます。 PHP 5.6の *bindTo と比較して、パフォーマンスがはるかに高速です。

例-PHP 7以前

<?php
   class A {
      private $x = 1;
   }

  //Define a closure Pre PHP 7 code
   $getValue = function() {
      return $this->x;
   };

  //Bind a clousure
   $value = $getValue->bindTo(new A, 'A');

   print($value());
?>

次のブラウザ出力を生成します-

1

例-PHP 7以降

<?php
   class A {
      private $x = 1;
   }

  //PHP 7+ code, Define
   $value = function() {
      return $this->x;
   };

   print($value->call(new A));
?>

次のブラウザ出力を生成します-

1

PHP 7-フィルタリングされたunserialize()

PHP 7では、フィルター処理された* unserialize()*関数が導入され、信頼できないデータのオブジェクトを非シリアル化する際のセキュリティが向上しています。 コードの挿入の可能性を防ぎ、開発者が非シリアル化できるクラスをホワイトリストに登録できるようにします。

<?php
   class MyClass1 {
      public $obj1prop;
   }
   class MyClass2 {
      public $obj2prop;
   }

   $obj1 = new MyClass1();
   $obj1->obj1prop = 1;
   $obj2 = new MyClass2();
   $obj2->obj2prop = 2;

   $serializedObj1 = serialize($obj1);
   $serializedObj2 = serialize($obj2);

  //default behaviour that accepts all classes
  //second argument can be ommited.
  //if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
   $data = unserialize($serializedObj1 , ["allowed_classes" => true]);

  //converts all objects into __PHP_Incomplete_Class object except those of MyClass1 and MyClass2
   $data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

   print($data->obj1prop);
   print("<br/>");
   print($data2->obj2prop);
?>

次のブラウザ出力を生成します-

1
2

PHP 7-IntlChar

PHP7では、新しい IntlChar クラスが追加され、追加のICU機能を公開しようとします。 このクラスは、Unicode文字の操作に使用できるいくつかの静的メソッドと定数を定義します。 このクラスを使用する前に、 Intl 拡張機能をインストールする必要があります。

<?php
   printf('%x', IntlChar::CODEPOINT_MAX);
   print (IntlChar::charName('@'));
   print(IntlChar::ispunct('!'));
?>

次のブラウザ出力を生成します-

10ffff
COMMERCIAL AT
true

PHP 7-CSPRNG

PHP 7では、次の2つの新しい関数が導入され、クロスプラットフォームで暗号的に安全な整数と文字列が生成されます。

  • * random_bytes()*-暗号的に安全な擬似乱数バイトを生成します。
  • * random_int()*-暗号的に安全な擬似乱数整数を生成します。

random_bytes()

random_bytes()は、ソルト、キー、または初期化ベクトルを生成するときなど、暗号の使用に適した任意の長さの暗号ランダムバイトの文字列を生成します。

構文

string random_bytes ( int $length )

パラメーター

  • length -バイト単位で返されるランダム文字列の長さ。

戻り値

  • 暗号化されて安全なランダムバイトの要求された数を含む文字列を返します。

エラー/例外

  • ランダム性の適切なソースが見つからない場合、例外がスローされます。
  • 無効なパラメーターが指定された場合、 TypeError がスローされます。
  • 無効なバイト長が指定されると、エラーがスローされます。

<?php
   $bytes = random_bytes(5);
   print(bin2hex($bytes));
?>

次のブラウザ出力を生成します-

54cc305593

random_int()

  • random_int()*は、偏りのない結果が重要な場合に使用するのに適した暗号化ランダム整数を生成します。

構文

int random_int ( int $min , int $max )

パラメーター

  • min -返される最小値。 PHP_INT_MIN 以上である必要があります。
  • max -返される最大値。 PHP_INT_MAX 以下でなければなりません。

戻り値

  • minからmaxまでの範囲の暗号的に安全なランダムな整数を返します。

エラー/例外

  • ランダム性の適切なソースが見つからない場合、 Exception がスローされます。
  • 無効なパラメーターが指定された場合、 TypeError がスローされます。
  • maxがminより小さい場合、*エラー*がスローされます。

<?php
   print(random_int(100, 999));
   print("");
   print(random_int(-1000, 0));
?>

次のブラウザ出力を生成します-

614
-882

PHP 7-期待

  • 期待*は、古いassert()関数に対する後方互換性のある拡張機能です。 期待により、実稼働コードでゼロコストのアサーションが可能になり、アサーションが失敗したときにカスタム例外をスローする機能が提供されます。 assert()は言語構成体になりました。最初のパラメーターは、テスト対象の文字列またはブール値と比較した式です。

assert()の設定ディレクティブ

Directive Default value Possible values
*zend.assertions * 1
  • 1* − generate and execute code (development mode)

    *0* -コードを生成しますが、実行時にジャンプします
    *-1* -コードを生成しません(本番モード)
*assert.exception * 0
  • 1 − throw, when the assertion fails, either by throwing the object provided as the exception or by throwing a new AssertionError* object if exception was not provided.

    *0* -上記のようにThrowableを使用または生成しますが、スローするのではなく、そのオブジェクトに基づいた警告のみを生成します(PHP 5の動作と互換性があります)

パラメーター

  • assertion -アサーション。 PHP 5では、これは評価される文字列またはテストされるブール値のいずれかでなければなりません。 PHP 7では、これは実行される値を返す任意の式でもあり、結果はアサーションが成功したか失敗したかを示すために使用されます。
  • description -アサーションが失敗した場合、失敗メッセージに含まれるオプションの説明。
  • exception -PHP 7では、2番目のパラメーターは説明文字列の代わりに Throwable オブジェクトにすることができます。この場合、アサーションが失敗し、 assert.exception 設定ディレクティブが有効。

戻り値

アサーションが偽の場合は FALSE 、そうでない場合は TRUE

<?php
   ini_set('assert.exception', 1);

   class CustomError extends AssertionError {}

   assert(false, new CustomError('Custom Error Message!'));
?>

次のブラウザ出力を生成します-

Fatal error: Uncaught CustomError: Custom Error Message! in...

PHP 7-ステートメントの使用

PHP7以降では、単一のuseステートメントを使用して、複数のuseステートメントの代わりに同じ名前空間からクラス、関数、および定数をインポートできます。

<?php
  //Before PHP 7
   use com\finddevguides\ClassA;
   use com\finddevguides\ClassB;
   use com\finddevguides\ClassC as C;

   use function com\finddevguides\fn_a;
   use function com\finddevguides\fn_b;
   use function com\finddevguides\fn_c;

   use const com\finddevguides\ConstA;
   use const com\finddevguides\ConstB;
   use const com\finddevguides\ConstC;

  //PHP 7+ code
   use com\finddevguides\{ClassA, ClassB, ClassC as C};
   use function com\finddevguides\{fn_a, fn_b, fn_c};
   use const com\finddevguides\{ConstA, ConstB, ConstC};

?>

PHP 7-エラー処理

PHP 7から、エラー処理とレポートが変更されました。 PHP 5で使用されていた従来のエラーレポートメカニズムでエラーをレポートする代わりに、ほとんどのエラーはエラー例外をスローすることで処理されます。 例外と同様に、これらのエラー例外は、最初に一致するcatchブロックに到達するまでバブルアップします。 一致するブロックがない場合、* set_exception_handler()*でインストールされたデフォルトの例外ハンドラーが呼び出されます。 デフォルトの例外ハンドラーがない場合、例外は致命的なエラーに変換され、従来のエラーのように処理されます。

エラー階層は例外から拡張されていないため、catch(例外$ e)を使用するコード\ {…​ } PHP 5でキャッチされない例外を処理するブロックは、このようなエラーを処理しません。 キャッチ(エラー$ e)\ {…​ 致命的なエラーを処理するには、ブロックまたは* set_exception_handler()*ハンドラーが必要です。

例外階層

<?php
   class MathOperations {
      protected $n = 10;

     //Try to get the Division by Zero error object and display as Exception
      public function doOperation(): string {
         try {
            $value = $this->n % 0;
            return $value;
         } catch (DivisionByZeroError $e) {
            return $e->getMessage();
         }
      }
   }

   $mathOperationsObj = new MathOperations();
   print($mathOperationsObj->doOperation());
?>

次のブラウザ出力を生成します-

Modulo by zero

PHP 7-整数部

PHP 7では、オペランドの整数除算を実行し、その除算をintとして返す新しい関数* intdiv()*が導入されました。

<?php
   $value = intdiv(10,3);
   var_dump($value);
   print(" ");
   print($value);
?>

次のブラウザ出力を生成します-

int(3)
3

PHP 7-セッションオプション

PHP7以降、* session_start()関数は、 *php.ini で設定されたセッション構成ディレクティブをオーバーライドするオプションの配列を受け入れます。 これらのオプションは session.lazy_write をサポートします。これはデフォルトでオンになっており、セッションデータが変更された場合、PHPがセッションファイルを上書きします。

追加された別のオプションは read_and_close です。これは、セッションデータを読み取り、その後セッションを変更せずにすぐに閉じることを示します。 たとえば、次のコードスニペットを使用して、 session.cache_limiter をprivateに設定し、読み取り直後にセッションを閉じるようにフラグを設定します。

<?php
   session_start([
      'cache_limiter' => 'private',
      'read_and_close' => true,
   ]);
?>

PHP 7-非推奨の機能

以下の機能は非推奨であり、PHPの将来のリリースから削除される可能性があります。

PHP 4スタイルのコンストラクター

PHP 4スタイルのコンストラクターは、定義されているクラスと同じ名前のメソッドであり、現在は非推奨であり、将来削除される予定です。 PHP 4コンストラクターがクラス内で定義されている唯一のコンストラクターである場合、PHP 7はE_DEPRECATEDを発行します。 __construct()メソッドを実装するクラスは影響を受けません。

<?php
   class A {
      function A() {
         print('Style Constructor');
      }
   }
?>

次のブラウザ出力を生成します-

Deprecated: Methods with the same name as their class will not be constructors
in a future version of PHP; A has a deprecated constructor in...

非静的メソッドの静的呼び出し

非静的メソッドへの静的呼び出しは非推奨であり、将来削除される可能性があります。

<?php
   class A {
      function b() {
         print('Non-static call');
      }
   }
   A::b();
?>

次のブラウザ出力を生成します-

Deprecated: Non-static method A::b() should not be called statically in...
Non-static call

password_hash()saltオプション

  • password_hash()*関数のsaltオプションは廃止され、開発者が独自の(通常は安全ではない)saltを生成しないようにしました。 開発者からソルトが提供されない場合、関数自体が暗号的に安全なソルトを生成します。したがって、カスタムのソルト生成はもう必要ありません。

capture_session_meta SSLコンテキストオプション

*capture_session_meta* SSLコンテキストオプションは廃止されました。 SSLメタデータは、* stream_get_meta_data()*関数を介して使用されるようになりました。

PHP 7-拡張機能とSAPIの削除

以下の拡張機能はPHP 7以降から削除されました-

  • ereg
  • mssql
  • MySQL
  • sybase_ct

次のSAPIはPHP 7以降から削除されました-

  • aolserver
  • アパッチ
  • apache_hooks
  • apache2filter
  • 尾部
  • 連続
  • イサピ
  • ミルター
  • nsapi
  • phttpd
  • pi3web
  • ロクセン
  • thttpd
  • tux
  • ウェブゲーム