ホームページ  >  記事  >  バックエンド開発  >  PHP5 の型制約学習メモ_PHP チュートリアル

PHP5 の型制約学習メモ_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:50:48835ブラウズ

php は、弱く型付けされたプログラミング言語です。 PHP プログラムでは、変数のデータ型は値の変更に応じて自動的に変更されます。PHP は変数のデータ型を強制的にチェックしたり制約したりしません。次の簡単なコード例を参照してください。

コードは次のとおりです対応する操作効果を以下の図に示します:
コードをコピー

クラス人 {


}

$a = 1; //このとき、$aは整数型(Integer)です

var_dump($a);

$a = 1.0; //このとき、$aは浮動小数点型(Float)です
var_dump($a);
$a = 'CodePlayer' //このとき、$aは文字列型(String)です
; var_dump($a);
$a = array('CodePlayer' => 'http://www.bKjia.c0m'); //このとき、$aは配列型(Array)です
var_dump($a);
$a = new Person(); //このとき、$a は Person オブジェクト型 (Object) です
var_dump($a);
$a = mysql_connect('localhost', 'username', 'password'); //このとき、$aはリソースタイプ(Resource)です
var_dump($a);
?>

PHP の弱いデータ型の特性により、PHP は使いやすく、柔軟になります。しかし、これはダモクレスの剣でもあります。 PHP の弱いデータ型の特性により、開発者は PHP プログラム コードを作成するとき、特に変数が関数のパラメーターとして渡されるとき、変数のデータ型の変更に常に注意を払う必要があります。結局のところ、ほとんどの関数パラメーターは特定のデータ型のみを想定しています。たとえば、次の例では、関数 SayHi() は Person オブジェクト タイプのパラメータ タイプを受け取ることを想定していますが、PHP は厳密に型指定された言語ではなく、変数のタイプのチェックを強制しないため、任意の値を渡すことができます。関数の型パラメータに影響を与え、プログラム エラーまたはロジック例外を引き起こします。


コードは次のとおりです クラス人 {

public $name = 'CodePlayer';
public $age = 3;
}

関数sayHi($person){

echo "こんにちは! 私の名前は $person->name です。私は $person->age 歳です。";

}

$p = '张三';

SayHi($p); // 予期された Person オブジェクト タイプではないため、通知レベルのエラー メッセージが表示されますが、プログラムは引き続き実行されます

echo 'Suffix' // テキストメッセージは出力されます
?>

PHP 5 以降では、新しい型制約メカニズムを使用して、関数パラメーターの一部のデータ型に型制約を加えることができます。上記のコードを例にとると、sayHi() 関数を記述するときに、渡されるパラメータが Person オブジェクト タイプである必要があることが要求できます。そうでない場合は、致命的なエラーが発生し、現在のページ スクリプトの実行が終了します。 PHP の型制約メカニズムを使用するのは非常に簡単で、関数によって宣言されたパラメーター変数の前に指定された型名を追加するだけです。この関数を呼び出すと、PHP は関数のパラメーターが指定された型であるかどうかを強制的にチェックし、そうでない場合は致命的なエラーが発生します。

コードをコピー
コードは次のとおりです コードをコピー

クラス人 {
public $name = 'CodePlayer';
public $age = 3;
}

関数sayHi(人$人){
echo "こんにちは! 私の名前は $person->name です。私は $person->age 歳です。";
}

$person = '張三';
SayHi($person); // 予期された Person オブジェクト タイプではないため、致命的エラーが発生し、プログラムが終了します
echo 'Suffix'; //テキストメッセージは出力されず、プログラムは終了します
?>

PHP 5 では、現在、オブジェクト、インターフェイス、配列、および呼び出し可能型のパラメーター変数のみが型制約を使用できることに注意してください (配列型は PHP 5.1 バージョンからサポートされ、呼び出し可能型は PHP 5.4 バージョンからサポートされます)。 )。
注: 型制約を使用するパラメーター変数がそのデフォルト値を null として宣言していない場合、関数の呼び出し時に対応するパラメーター変数に null 値を渡すことはできません。そうしないと、エラーも報告されます。


型制約は、int や string などのスカラー型では使用できません。特性も許可されません。

例 #1 型制約の例

コードは次のとおりです コードをコピー

//以下のようなクラス
クラスMyClass
{
/**
* テスト機能
* 最初のパラメータは OtherClass クラスのオブジェクトである必要があります
​​*/
パブリック関数テスト(OtherClass $otherclass) {
echo $otherclass->var;
}


/**
* 別のテスト機能
* 最初のパラメータは配列である必要があります
​​*/
パブリック関数 test_array(array $input_array) {
print_r($input_array);
}
}

/**
* 最初のパラメータは再帰型である必要があります
​​*/
パブリック関数 test_interface(Traversable $iterator) {
echo get_class($iterator);
}

/**
* 最初のパラメータはコールバック型である必要があります
​​*/
パブリック関数 test_callable(callable $callback, $data) {
call_user_func($callback, $data);
}
}

// OtherClass クラス定義
クラスOtherClass {
パブリック $var = 'Hello World';
}
?>

関数呼び出しのパラメータが定義されたパラメータの型と一致しない場合、キャッチ可能な致命的なエラーがスローされます。

コードは次のとおりです コードをコピー

//2 つのクラスのオブジェクト
$myclass = 新しい MyClass;
$otherclass = 新しいOtherClass;

// 致命的なエラー: 最初のパラメータは OtherClass クラスのオブジェクトである必要があります
$myclass->test('hello');

// 致命的なエラー: 最初のパラメータは OtherClass クラスのインスタンスである必要があります
$foo = 新しい stdClass;
$myclass->test($foo);

// 致命的なエラー: 最初のパラメータを null にすることはできません
$myclass->test(null);

// 正解: Hello World を出力します
$myclass->test($otherclass);

// 致命的なエラー: 最初のパラメータは配列である必要があります
$myclass->test_array('文字列');

//修正: 出力配列
$myclass->test_array(array('a', 'b', 'c'));

// 正解: 出力 ArrayObject
$myclass->test_interface(new ArrayObject(array()));

// 正解: int(1) を出力
$myclass->test_callable('var_dump', 1);
?>

型制約はクラスのメンバー関数で使用されるだけでなく、関数でも使用できます:

コードは次のとおりです コードをコピー

// 以下のようなクラス
クラス MyClass {
パブリック $var = 'Hello World';
}

/**
* テスト機能
* 最初のパラメータは MyClass クラスのオブジェクトである必要があります
​*/
関数 MyFunction (MyClass $foo) {
エコー $foo->var;
}

//正解です
$myclass = 新しい MyClass;
MyFunction($myclass);
?>
型制約では NULL 値が許可されます:

/* NULL 値を受け入れます */
関数テスト(stdClass $obj = NULL) {

}

テスト(NULL);
テスト(新しい標準クラス);

?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632617.html技術記事 PHP は、型指定が弱いプログラミング言語です。 PHP プログラムでは、変数のデータ型は値の変更に応じて自動的に変更される可能性があり、PHP は変数のデータ型を強制的にチェックしません...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。