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);
テスト(新しい標準クラス);
?>
|
http://www.bkjia.com/PHPjc/632617.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632617.html技術記事 PHP は、型指定が弱いプログラミング言語です。 PHP プログラムでは、変数のデータ型は値の変更に応じて自動的に変更される可能性があり、PHP は変数のデータ型を強制的にチェックしません...