PHP 物件導向編程中的一些函數操作

來源:互聯網
上載者:User

標籤:des   io   ar   os   使用   sp   for   資料   on   

  1. 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 物件導向編程中的一些函數操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.