オーバーロード
属性のオーバーロードとメソッドのオーバーロード
PHP によって提供される「オーバーロード」とは、クラスの属性とメソッドを動的に「作成」することを指します。私たちはこれを魔法の方法で行います。
現在の環境で未定義または非表示のクラス属性またはメソッドが呼び出されるときに、オーバーロードされたメソッドが呼び出されます。
オーバーロードされたメソッドはすべて public に宣言する必要があります。
public void __set ( string $name ,mixed $value )
publicmixed __get ( string $name )
public bool __isset ( string $name )
public void __unset ( string $name )
アクセスできないプロパティに値を割り当てると、__set() が呼び出されます。
アクセスできないプロパティの値を読み取る場合、__get() が呼び出されます。
アクセスできないプロパティに対して isset() または empty() が呼び出される場合、 __isset() が呼び出されます。
アクセスできないプロパティに対して unset() が呼び出される場合、 __unset() が呼び出されます。
パラメータ $name は、操作される変数の名前を指します。 __set() メソッドの $value パラメーターは、$name 変数の値を指定します。
プロパティのオーバーロードはオブジェクト内でのみ実行できます。静的メソッドでは、これらのマジック メソッドは呼び出されません。したがって、これらのメソッドはいずれも静的として宣言できません。 PHP 5.3.0 では、これらのマジック メソッドを静的として定義すると警告が生成されます。
例:
class a{ public function __set($name,$value){ //$this->data[$name]=$value; $this->$name=$value; } public function __get($name){ return $this->$name; } public function __isset($name){ return isset($this->$name); } public function __unset($name){ unset($this->$name); }}$obj_a=new a();$obj_a->first='first';echo $obj_a->first."<br>";echo isset($obj_a->second)?'second exist<br>':'second not exist<br>';echo isset($obj_a->first)?'first exist<br>':'first not exist<br>';echo empty($obj_a->first)?'first exist<br>':'first not exist<br>';unset($obj_a->first);echo isset($obj_a->first)?'first exist<br>':'first not exist<br>';
結果:
最初
二番目に存在しない
最初に存在する
最初に存在しない
まず存在しません
public混合 __call ( string $name , array $arguments )
public staticmixed __callStatic ( string $name , array $arguments )
in Whenオブジェクト内でアクセスできないメソッドが呼び出されると、__call() が呼び出されます。
静的モードでアクセスできないメソッドを呼び出すと、__callStatic() が呼び出されます。
$name パラメータは、呼び出されるメソッドの名前です。 $arguments パラメーターは、メソッド $name に渡されるパラメーターを含む列挙配列です。
例:
echo "<pre class="brush:php;toolbar:false">";class a { public function __call($name,$arguments){ if($name=='mycall'){ print_r($arguments); call_user_func('mycall',$arguments[0],$arguments[1]); }else{ echo "call uknow function"; } }}function mycall($a1,$a2){ echo "this is mycall<br>"; print_r($a1); print_r($a2); echo "end of mycall<br>";}$obj_a=new a();$obj_a->mycall(['a'=>'aaa'],['a2'=>'a2']);$obj_a->notcall();
結果:
Array( [0] => Array ( [a] => aaa ) [1] => Array ( [a2] => a2 ))this is mycallArray( [a] => aaa)Array( [a2] => a2)end of mycallcall uknow function
例:
echo "<pre class="brush:php;toolbar:false">";class a { public static function __callStatic($name,$arguments){ if($name=='mycall'){ print_r($arguments); call_user_func('mycall',$arguments[0],$arguments[1]); }else{ echo "call uknow function"; } }}function mycall($a1,$a2){ echo "this is mycall<br>"; print_r($a1); print_r($a2); echo "end of mycall<br>";}$obj_a=new a();$obj_a::mycall(['a'=>'aaa'],['a2'=>'a2']);$obj_a::notcall();
結果:
Array( [0] => Array ( [a] => aaa ) [1] => Array ( [a2] => a2 ))this is mycallArray( [a] => aaa)Array( [a2] => a2)end of mycallcall uknow function