「PHP」の版間の差分

出典: フリー教科書『ウィキブックス(Wikibooks)』
削除された内容 追加された内容
→‎クラス: PHPではコンストラクタ名が "__construct" に決まっています。これ以外のものに名前を変えるとエラーになります。
297 行 297 行
「Deprecated: 」と警告的なメッセージが出るように、これはバグの原因になりやすいので、const宣言したクラス変数のアロー演算子変数の作成は、なるべく避けるのが安全でしょう。
「Deprecated: 」と警告的なメッセージが出るように、これはバグの原因になりやすいので、const宣言したクラス変数のアロー演算子変数の作成は、なるべく避けるのが安全でしょう。


==== コンストラクタ ====
下記コードは、 [https://www.php.net/manual/ja/language.oop5.properties.php 公式マニュアル]のうち、説明の簡単のために、これから説明する「コンストラクタ」と関係ない部分の変数をaaとかbbbbとかに変えたものです。

<syntaxhighlight lang="PHP">
<?php

class User
{
public int $id;
public ?string $name;

public function __construct(int $aa, ?string $bbbb)
{
$this->id = $aa;
$this->name = $bbbb;
}
}

$ist = new User(123, null);

var_dump($ist->id);
var_dump($ist->name);

?>
</syntaxhighlight>

実行結果
<pre>
int(123)
NULL
</pre>

コンストラクタは、そのクラスのインスタンスが生成(new)されたときに実行される関数のことですが、PHPではコンストラクタ名が "__construct" に決まっています。これ以外のものに名前を変えるとエラーになります。

このセクションで重要なのは、上記のコンストラクタの説明です。下記はおまけの話題にすぎません。

<code>var_dump</code> は単なる出力表示の一種です。気になるなら、 print などの見慣れた関数に置き換えても構いません。

<code>int</code> や <code>?string </code> は型名です。最近のPHPでは、クラスの変数の宣言の際、型をつけられます。詳しくは公式マニュアルなどをお読みください。


[[Category:PHP|*]]
[[Category:PHP|*]]

2022年6月13日 (月) 18:07時点における版

メインページ > 工学 > 情報技術 > プログラミング > PHP

PHPは、SSI (サーバSide Includes) と主にWebサーバ環境で動作するスクリプト言語です。

目次

  1. PHP/開発環境
  2. PHP/開発環境/インストール
  3. PHP/確実に動作させるまで
    1. 参考: PHP/コマンドラインでの活用
  4. PHP入門
    1. PHP/入門/テキスト表示とコメント
    2. PHP/入門/変数と値
  5. PHP/HTMLフォームからのデータ受け取り
  6. PHP/ファイル入出力 (headerによるダウンロードもここ)
  7. PHP/配列
  8. PHP/データベースとの連動
  9. 制御構造
    1. PHP/条件分岐 (ログイン画面の作り方やクッキーもこの単元)
    2. PHP/繰り返し
  10. PHP/入門/関数とは
  11. PHP/入門/変数の種類 ※進捗0%
この節は書きかけです。この節を編集してくれる方を心からお待ちしています。

前書き

PHPの動作は、Web上におけるPerlのそれとよく似ていますが、Perlと異なりHTMLの内部にスクリプトを記述し実行することができるので、動的なウェブサイトを作成する際に、より容易に用いることができます。また、MySQLなどのデータベースとの親和性も高く、これはMediaWikiなどのソフトウェアにも活かされています。 PHPは2020年6月現在、2つの主要なバージョン (PHP5とPHP7) が提供されています。

PHP6は破棄され、ありません。

Cの様な構文、手頃な速度、および手軽に利用できるのでPHPは多くのプログラマとデザイナに使われる様になりました。Perlと同様に初心者でも、非常に簡単に習得できるのも特徴です。

※ 未分類

※ ここには作成途中などで、どの単元に入れたらいいか分からない単元を書きます。単元が完成したら、目次中の適する単元に移動したり、あるいは既存の単元に適するものがなければ単元を新規作成してください。

JavaScriptとPHPの連携

PHP上でJavaScriptの命令を書き込む場合、たとえば下記のようになる。

基本

<?php
	print "
	    <script>
            alert('Hello World!');
        </script>
        ";
	
?>

これをそのまま、test.php などとしてwebサーバにアップロードして localhost/test.php などにアクセスすれば、ブラウザ上でアラート(これはJavaScriptの機能)が実行されて表示される。


documentwrite などを使うには、下記のようにします。print よりも echo を用いるほうが安全に成功します。

<?php
echo <<<EOM
	<script>
	document.write("asdf");
	</script> 
EOM;
?>

表示結果

asdf

画像や動画など

上述のような方法で、下記のように図形なども表示させることが可能です。(下記コード内部のJavaScript部分は、HTML/HTML5#簡単な動画の例 からの引用です。)

静止画のコード例
<?php
echo <<<EOM


	<!DOCTYPE html>
<html lang="ja">
<head>
    <title>簡単なページ</title>
</head>
<body>

  <canvas id="canvas" width="320" height="240">
  </canvas>

  <script>
    var canvas = document.querySelector("#canvas");
    var ctx    = canvas.getContext("2d");
    ctx.fillStyle = "rgb(0,0,200)";
    ctx.fillRect(100, 100, 200, 200);
  </script>

</body>
</html>
	
    
EOM;
?>

実行結果は、もし実行に成功すれば、webブラウザでのアクセス時に青い四角が表示されます。

アニメーションの表示は、PHP側で処理すると通信に負担が掛かってしまうので、JavaScript側で処理させましょう。(下記コード内部のJavaScript部分は、HTML/HTML5#簡単な動画の例 からの引用です。)

動画のコード例
<?php
echo <<<EOM
	
	<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>簡単なcanvasアニメ</title>
  </head>
  <body>
    <canvas id="canvas" width="600" height="500"></canvas>
    <script>
      var cvs = document.getElementById("canvas"); // canvas要素の作成
      var ctx = cvs.getContext("2d"); // コンテキストの取得 // なお、以降cvsは使わない

      var count = 0; // 時間を数えるためのカウンター


      var dummy = function draw() { // var でメモリなど確保しないと後工程が上手く行かない。
        /* 背景色 */
        ctx.clearRect(0,0,600,500); // clearRect プロパティにて範囲指定で消せる
  
        /* 描画オブジェクト */
        ctx.fillStyle="#00F";// 青い四角をこれから動かす  
        ctx.fillRect(50 + count,30, 40, 40); // fillRectで四角を描画できる
  
        if(count < 300){
          count++; // 単なるインクリメント
        } // if count の終わり
        
        // 追加
        if(count > 150){
          clearInterval(kakuho);
        } // if count の終わり
        // 上記を追加
        
      } // function の終わり

      // 下記コードが追加された
      var kakuho = setInterval(dummy,10); // setInterval の終わり // var で確保しないと clear で止まらない場合あり
      
    </script>
  </body>
</html>

	
EOM;
?>

実行結果は、もし実行に成功すれば、webブラウザでのアクセス時に青い四角のアニメーション(始点の左から、右にむかってアニメーションします)が表示されます。

クラス

基本

PHP にはクラスというものがあり、使い方は下記コードのように、変数などをまとめるものです。配列とは異なり、クラスなら、たとえば整数と文字列など、型の違ったものもまとめる事ができます。

<?php
class sample
{
  public $a;
  public $b;
}

$dummy = new sample; // インスタンス

$dummy->a = 5;
$dummy->b = "asd";

printf("%d\n", $dummy->a);
printf("%s\n", $dummy->b);

?>

実行結果

5
asd

public は、プログラミング用語でアクセス修飾子というものの一種です。public で修飾された要素は、クラス外部からアクセスできます。(C++やJavaに同様の「アクセス修飾子」という機能があり、似たような機能です。というか、C++やJavaのほうが実装が先で、それをあとからPHPが実装を真似ました。)

アクセス修飾子には、public のほか private があります。private で修飾された要素は、そのクラス内部の他の要素からしかアクセスできなくなります。

PHP のクラスの定義では、要素にひとつずつ public か private かなどの指定をしないといけません。public class (※エラーになる)や public {$a; $b} (※エラーになる)などと宣言してもエラーになります。

$dummy = new sample;の作業は、「インスタンス」という作業であり、こうすることでクラスの実体(メモリ上などでの実配置に相当)を1つ作成します。インスタンスをしないと、まだ実体が確保されておらず、なのでクラスの宣言文内部の各要素にはアクセス不能です(そもそもメモリ上などに実体が無いので)。

PHPのクラスの場合でのインスタンスは $変数名 = new クラス名;という書式で行います。newという演算子が必ず必要です。new演算子をもちいた変数への代入という書式によって、インスタンスが行われます。


-> はアロー演算子というものです。C++などに同様の名前の演算子があります。(なお、標準Cにもアロー演算子というものはあるが、意味は異なります。)

PHPでは、クラスで宣言した要素にアクセスする際、アロー演算子で上記コードのようにアクセスします。PHP のクラスの利用でなぜアロー演算子を使うのかと言われても、そのように仕様が決まっているので、「そういう規則だから」としか言い様がありません。

なお、クラスのブロック内で定義された変数や定数のことを(上記コードの $a や $b のこと)、プロパティと言います。クラスでは、プロパティの他にも、クラスのブロック内で関数を定義することができ、そのようなクラス内関数のことをメソッドと言います。


他の言語との相違点

C++ には「構造体」というクラスと似た機能がありますが、しかしPHPには「構造体」はありません。なお、構造体は標準C言語にもあります(またなお、標準C言語にクラス機能は無い)。

「クラス」と言われる機能はC++以降の新しい時代の他の多くのプログラミング言語にもありますが、しかしその機能はプログラミング言語ごとに差が大きいです。

動的プロパティ

現状のPHP8.1および以前のバージョンでは下記コードのようにクラスで宣言していない変数(下記コードの場合の $a がそれである)であっても、その後に追加できる。

<?php
class sample
{
              // $a の宣言を消去
  public $b;
}

$dummy = new sample; // インスタンス

$dummy->a = 16; // $a は冒頭のクラスでは宣言されていない
$dummy->b = 31; // 本コードでは以降は不使用。参考用に記述

printf("%d\n", $dummy->a);
?>

実行結果

16

上記コードの $b のようにクラス内ですでに宣言されているプロパティのことを静的プロパティと言います。 一方、上記コードのクラス内からは消された $a のように、クラス外で初めて宣言されたプロパティのことを動的プロパティと言います。


PHP のメンバ変数には定数を定義することも出来ます。その場合、 $はつけません。下記コードの場合「$var3」だとエラーになります。

また、定数メンバにアクセスするには、インスタンス後(new後)に、クラス名::メンバ変数名でアクセスします。通常変数の場合とは違うので、注意してください。アクセス方法を間違えると、インタプリタ実行時のエラー実行不能になったり、思わぬバグを招くので、要注意です。

<?php
class SimpleClass
{
   const var1 = 1+2;
}

$dummy = new SimpleClass;
print($dummy::var1);

?>

実行結果

3


下記は、意図的にセミコロン2個とアロー演算子を間違えた例です。

<?php
class SimpleClass
{
   const var1 = 1+2;
}

$dummy = new SimpleClass;
print($dummy::var1) . "\n";


// $dummy::var1 = 5; // エラーになる
 $dummy->var1 = 5; // アローのほうに定義できるが・・・
print($dummy::var1) . "\n"; // セミコロン2個のほうは3のまま
print($dummy->var1) . "\n"; //

?>

実行結果

3

Deprecated: Creation of dynamic property SimpleClass::$var1 is deprecated in /home/ユーザー名/test.php on line 12
3
5

このように、アロー演算子のとセミコロン2個のは、それぞれ別々の変数として扱われます。

「Deprecated: 」と警告的なメッセージが出るように、これはバグの原因になりやすいので、const宣言したクラス変数のアロー演算子変数の作成は、なるべく避けるのが安全でしょう。

コンストラクタ

下記コードは、 公式マニュアルのうち、説明の簡単のために、これから説明する「コンストラクタ」と関係ない部分の変数をaaとかbbbbとかに変えたものです。

<?php

class User
{
    public int $id;
    public ?string $name;

    public function __construct(int $aa, ?string $bbbb)
    {
        $this->id = $aa;
        $this->name = $bbbb;
    }
}

$ist = new User(123, null);

var_dump($ist->id);
var_dump($ist->name);

?>

実行結果

int(123)
NULL

コンストラクタは、そのクラスのインスタンスが生成(new)されたときに実行される関数のことですが、PHPではコンストラクタ名が "__construct" に決まっています。これ以外のものに名前を変えるとエラーになります。

このセクションで重要なのは、上記のコンストラクタの説明です。下記はおまけの話題にすぎません。

var_dump は単なる出力表示の一種です。気になるなら、 print などの見慣れた関数に置き換えても構いません。

int?string は型名です。最近のPHPでは、クラスの変数の宣言の際、型をつけられます。詳しくは公式マニュアルなどをお読みください。