PHP7-クイックガイド

PHP 7とは何ですか?

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

新機能

PHP 7には数十の機能が追加されており、最も重要な機能を以下に示します。

  • Improved performance − PHPNGコードをPHP7にマージすると、PHP5の2倍の速度になります。

  • Lower Memory Consumption −最適化されたPHP 7は、より少ないリソースを使用します。

  • Scalar type declarations −パラメータと戻り値の型を適用できるようになりました。

  • Consistent 64-bit support −64ビットアーキテクチャマシンの一貫したサポート。

  • Improved Exception hierarchy −例外階層が改善されました。

  • Many fatal errors converted to Exceptions −例外の範囲が拡大され、例外として変換された多くの致命的なエラーがカバーされます。

  • Secure random number generator −新しい安全な乱数ジェネレータAPIの追加。

  • Deprecated SAPIs and extensions removed −さまざまな古いサポートされていないSAPIおよび拡張機能が最新バージョンから削除されています。

  • The null coalescing operator (??) −新しいnull合体演算子が追加されました。

  • Return and Scalar Type Declarations −戻り値の型とパラメータ型のサポートが追加されました。

  • Anonymous Classes −匿名のサポートが追加されました。

  • Zero cost asserts −ゼロコストアサートのサポートが追加されました。

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

あたりとしてのZendチームは、次の図は、人気のPHPベースのアプリケーション上のPHP 5.6とHHVM 3.7対PHP 7のパフォーマンスの比較を示します。

Magento 1.9

PHP 7は、Magentoトランザクションの実行中にPHP 5.6と比較して、2倍以上高速であることが証明されています。

Drupal 7

PHP 7は、Drupalトランザクションの実行中にPHP 5.6と比較して、2倍以上高速であることが証明されています。

Wordpress 3.6

PHP 7は、Wordpressトランザクションの実行中に、PHP5.6と比較して2倍以上高速であることが証明されています。

動的言語の比較

オプションオンラインでお試しください

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

CodingGroundで入手可能なオンラインコンパイラを使用して、次の例を試してください。

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

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

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

  • Web Server− PHPは、Microsoftのインターネットインフォメーションサーバー(IIS)を含む、事実上すべてのWebサーバーソフトウェアで動作しますが、最も頻繁に使用されるのはApacheサーバーです。ここからApacheを無料でダウンロード-http://httpd.apache.org/download.cgi

  • Database− 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をインストールして構成する方法について説明します。

  • LinuxまたはUnixでのApacheを使用したPHPのインストール

  • Apacheを使用したMacOSXへのPHPのインストール

  • IISを使用したWindowsNT / 2000 / XPへのPHPのインストール

  • Apacheを使用したWindowsNT / 2000 / XPへのPHPのインストール

Apache構成

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

ここをチェックしてください-ApacheサーバーでのPHP構成

PHP.INIファイルの構成

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

こちらを確認してください-PHP.INIファイルの構成

WindowsIISの構成

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

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

  • coercive --coerciveはデフォルトモードであり、指定する必要はありません。

  • strict -厳密モードは明示的にヒントを与える必要があります。

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

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

例-強制モード

<?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の新機能、 Return type declarationsが導入されました。戻り値の型宣言は、関数が返す値の型を指定します。戻り値の型については、次の型を宣言できます。

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

例-有効な戻り値の型

<?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の新機能、 null coalescing operator (??)が導入されました。を置き換えるために使用されますternaryisset()関数と組み合わせた操作。ザ・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では、新機能である宇宙船オペレーターが導入されました。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

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

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

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

cat

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

<?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

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

例-PHP7以前

<?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

例-PHP7 +

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

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

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

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

1

PHP7はFilteredを導入します 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

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

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

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

10ffff
COMMERCIAL AT
true

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 スローされます。

  • 最大値が最小値未満の場合、 Error スローされます。

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

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

614
-882

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

assert()の構成ディレクティブ

指令 デフォルト値 可能な値
zend.assertions 1

1 −コードの生成と実行(開発モード)

0 −コードを生成しますが、実行時にジャンプします

-1 −コードを生成しない(本番モード)

assert.exception 0

1 −例外として提供されたオブジェクトをスローするか、新しいオブジェクトをスローすることにより、アサーションが失敗した場合にスローします。 AssertionError 例外が提供されなかった場合はオブジェクト。

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

パラメーター

  • assertion−アサーション。PHP 5では、これは評価する文字列またはテストするブール値のいずれかである必要があります。PHP 7では、これは値を返す任意の式でもかまいません。値は実行され、その結果はアサーションが成功したか失敗したかを示すために使用されます。

  • description −アサーションが失敗した場合に、失敗メッセージに含まれるオプションの説明。

  • exception − PHP 7では、2番目のパラメーターは Throwable 記述文字列の代わりにオブジェクト。この場合、アサーションが失敗し、アサーションが失敗した場合にスローされるオブジェクトです。 assert.exception 構成ディレクティブが有効になります。

戻り値

FALSE アサーションが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...

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

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

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

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

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

?>

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

エラー階層はExceptionから拡張されていないため、catch(Exception $ 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

PHP7に新しい機能が導入されました intdiv()、オペランドの整数除算を実行し、除算をintとして返します。

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

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

int(3) 
3

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

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

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

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

PHP4スタイルのコンストラクター

PHP 4スタイルのコンストラクターは、それらが定義されているクラスと同じ名前のメソッドであり、現在は非推奨であり、将来削除される予定です。PHP 4コンストラクターがクラス内で定義された唯一のコンストラクターである場合、PHP7は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()ソルトオプション

のソルトオプション password_hash()開発者が独自の(通常は安全でない)ソルトを生成しないように、関数は非推奨になりました。開発者がソルトを提供しない場合、関数自体が暗号的に安全なソルトを生成します。したがって、カスタムソルト生成は不要になります。

Capture_session_metaSSLコンテキストオプション

ザ・ capture_session_metaSSLコンテキストオプションは非推奨になりました。SSLメタデータは、stream_get_meta_data() 関数。

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

  • ereg
  • mssql
  • mysql
  • sybase_ct

以下のSAPIはPHP7以降から削除されました-

  • aolserver
  • apache
  • apache_hooks
  • apache2filter
  • caudium
  • continuity
  • isapi
  • milter
  • nsapi
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • tux
  • webjames