標籤:des io ar os 使用 sp for 資料 on
-
get_object_vars函數,將對象中有存取權限的的欄位轉為數組
<?phpclass foo { private $a; public $b = 1; public $c; private $d; static $e; public function test() { var_dump(get_object_vars($this)); }}$test = new foo;var_dump(get_object_vars($test));$test->test();?>
結果
array(2) { ["b"]=> int(1) ["c"]=> NULL}array(4) { ["a"]=> NULL ["b"]=> int(1) ["c"]=> NULL ["d"]=> NULL}
2.array get_class_methods ( mixed $class_name )與array get_class_vars ( string $class_name )
得到類中的所有可訪問的方法
<?phpclass myclass { // constructor public function myclass() { return(true); } // method 1 protected function myfunc1() { return(true); } // method 2 private function myfunc2() { return(true); } public function description() { $class_methods = get_class_methods($this); //or $class_methods = get_class_methods(__CLASS__); foreach ($class_methods as $method_name) { echo "$method_name\n"; } }}$class_methods = get_class_methods(‘myclass‘); //得到所有公開的方法名稱foreach ($class_methods as $method_name) { echo "$method_name\n";}//結果是==》myclass description$class_methods = get_class_methods(new myclass());//得到所有公開的方法名稱,注意,構造方法為private或者protected時報錯foreach ($class_methods as $method_name) { echo "$method_name\n";}//結果是==》myclass description$t = new myclass();$t->description();//結果是==》myclass myfunc1 myfunc2 description?>
2.__call魔術方法
在php官方描述中是調用不存在的方法時調用,這個定義不太完整,正確的定義是調用不存在或者非public的方法時觸發
<?phpclass User { // method 1 protected function say() { return(true); } // method 2 private function sing() { return(true); } public function __call($name,$args) { $t = func_get_args(); //在預設函數中總用比較明顯 print_r($t); }}$m = new User();$m->say(); //不觸發$m->sing();//觸發$m->talk();//觸發?>
2.__set,__get,__unset,__isset
有些時候對象為了適應變化,比如Model的欄位經常改變,需要零時改變欄位,這時需要動態添加或者刪除屬性
<?phpclass PropertyTest { //動態資料儲存容器 private $data = array(); /** 重載不能被用在已經定義的屬性 */ public $declared = 1; /** 只有從類外部存取這個屬性時,重載才會發生 */ private $hidden = 2; public function __set($name, $value) { // $this->$name = $value; //這種也是一種動態擴容的方式,但管理起來比較麻煩 $this->data[$name] = $value; } public function __get($name) { echo "Getting ‘$name‘\n"; if (array_key_exists($name, $this->data)) { return $this->data[$name]; } $trace = debug_backtrace(); trigger_error( ‘Undefined property via __get(): ‘ . $name . ‘ in ‘ . $trace[0][‘file‘] . ‘ on line ‘ . $trace[0][‘line‘], E_USER_NOTICE); return null; } /** PHP 5.1.0之後版本,調用,使用 isset判斷時調用 */ public function __isset($name) { echo "Is ‘$name‘ set?\n"; return isset($this->data[$name]); } /** PHP 5.1.0之後版本,刪除某個屬性時 */ public function __unset($name) { echo "Unsetting ‘$name‘\n"; unset($this->data[$name]); } /** 非魔術方法 */ public function getHidden() { return $this->hidden; }}echo "<pre>\n";$obj = new PropertyTest;$obj->a = 1;echo $obj->a . "\n\n";var_dump(isset($obj->a));unset($obj->a);var_dump(isset($obj->a));echo "\n";echo $obj->declared . "\n\n";echo $obj->getHidden() . "\n";echo $obj->hidden . "\n";?>
代碼中如下片段,類似於日誌跟蹤工具
$trace = debug_backtrace(); trigger_error( ‘Undefined property via __get(): ‘ . $name . ‘ in ‘ . $trace[0][‘file‘] . ‘ on line ‘ . $trace[0][‘line‘], E_USER_NOTICE);
4.get_class, get_parent_class,interface_exists,is_subclass_of,is_a,instanceOf
<?phpif(!interface_exists(‘man‘)){ interface man { public function talk($msg); }}class dad { function dad() { // implements some logic }}class child extends dad implements man{ public function __toString() { return "I‘m ".get_parent_class($this)."‘s son\n"; } public function talk($msg) { echo $msg; }}class child2 extends dad { public function __toString() { return "I‘m ".get_parent_class(‘child2‘)."‘s son too\n"; }}$foo = new child();$bar = new child2();$dad = new dad();echo ‘<pre>‘; var_dump(get_class($dad)); var_dump(get_class($foo)); var_dump(get_class($bar));echo "<hr/>";var_dump(get_parent_class($dad));var_dump(get_parent_class($foo));var_dump(get_parent_class($bar));echo "<hr/>";var_dump(is_subclass_of($foo,‘dad‘));var_dump(is_subclass_of($foo,‘child‘)); //child類不是child類的子類,返回falsevar_dump(is_subclass_of($foo,‘man‘));echo "<hr/>";var_dump(is_subclass_of(‘child‘,‘dad‘));var_dump(is_subclass_of(‘child‘,‘child‘));//child類不是child類的子類.返回falsevar_dump(is_subclass_of(‘child‘,‘man‘));echo "<hr/>";var_dump(is_a($foo,‘dad‘));//is_a等價於 instanceOfvar_dump(is_a($foo,‘man‘));var_dump(is_a($foo,‘child‘));echo "<hr/>";var_dump(($foo instanceof dad));var_dump(($foo instanceof child));var_dump(($foo instanceof man));?>
結果如下
string(3) "dad"string(5) "child"string(6) "child2"-------------------------------------------------------------------bool(false)string(3) "dad"string(3) "dad"-------------------------------------------------------------------bool(true)bool(false)bool(true)-------------------------------------------------------------------bool(true)bool(false)bool(true)-------------------------------------------------------------------bool(true)bool(true)bool(true)-------------------------------------------------------------------bool(true)bool(true)bool(true)
好了,今天就到這裡
PHP 物件導向編程中的一些函數操作