6. PHP 面向对象

发布于 2024-11-06 12:15:25 字数 6232 浏览 6 评论 0

1.6.1. 面向对象方法 get_object_vars、is_subclass_of、interface_exists

  1. get_object_vars($obj) 获得对象的属性,以关联数组形式返回。
  2. get_parent_class(),参数是对象或者是类名,获得父类。
  3. is_subclass_of($obj,$class):判断对象是否是某个类的子类实例化产生的。
  4. interface_exists():判断接口是否存在。
  5. get_class():获得当前对象是哪个类实例化出来的。
  6. get_declared_classes():以数组形式返回当前脚本中所有的类。
  7. get_declared_interfaces():以数组形式返回当前脚本中的所有接口。
  8. method_exists():判断某个类中是否存在某个方法,也就是检查类的方法是否存在。
  9. property_exists():判断某个类中是否存在某个属性,也就是检查类的属性是否存在。
  10. instanceof:判断某个对象是否是某个类实例化产生的。
  11.  

1.6.2. static, self, parent, and this

  1. static
    • static 关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”。
    • static 的属性,在内存中只有一份,为所有的实例共用。也就是说,在内存中即使有多个实例,静态的属性也只有一份。
    • static 关键字可以用来修饰变量、方法。
    • 通过 static 关键字定义的属性或方法(例如 static $web),只能由当前类通过【self::$web】来访问,其他类和子类是无法访问的。
  2. $this 指的是实例化的对象,而不是类本身
  3. self 指的是类本身,而不是实例化的对象
  4. 在 PHP 中,子类继承父类并改写了父类中的方法,但是依然想要调用父类中的方法,就用 parent

1.6.3. trait

1.6.4. 魔术方法

  1. __construct(),类的构造函数
  2. __destruct(),类的析构函数
  3. __call(),在对象中调用一个不可访问方法时调用
    实例化的对象执行没有定义的方法或无权限访问的方法会报错,但是通过__call 方法可以避免报错,并输出一些提示信息!
    
    class C{
        public function show(){
        echo 'show';
        }
        function __call($methodName/*方法名*/,$args/*参数*/){
        echo $methodName;
        }
    }
    $c = new C();
    $c->go();
    
  4. __callStatic(),用静态方式中调用一个不可访问方法时调用
  5. __get(),获得一个类的成员变量时调用,通过它可以在对象的外部获取私有成员属性的值。
    当调用一个权限上不允许调用的属性或不存在的属性时,__get 魔术方法会自动调用,并且自动传参,参数值是属性名。
    
    class Person{
        public $name = 'fxxy';
        protected $age = 23;
        private $sex = 'man';
        function __get($var){
        echo '你想访问我的'.$var.'属性';
        }
    }
    $person = new Person();
    echo $person->name;//fxxy
    echo $person->age;//你想访问我的 age 属性
    echo $person->sex;//你想访问我的 sex 属性
    echo '<pre/>';
    print_r($person);
    
  6. __set(),设置一个类的成员变量时调用,用来设置私有属性值。
    当给一个权限上不允许直接访问或者是不存在的属性设置属性值时,__set 魔术方法会自动调用
    
    class Person{
        public $name;
        protected $age;
        private $sex;
        public function __set($a,$b){
        echo '你想给我的'.$a.'赋值'.'并且值是'.$b.'<br/>';
        }
    }
    $person = new Person();
    $person->name = 'fxxy';//fxxy
    $person->age = '28';//你想给我的 age 赋值并且值是 28
    $person->sex = 'man';//你想给我的 sex 赋值并且值是 man
    echo $person->name.'<br/>';
    
  7. __isset(),当对 private 属性调用 isset() 或 empty() 时调用。
    用 isset() 判断某个某个属性属性是否存在时,__isset() 自动执行。
    
  8. __unset(),当对 private 属性调用 unset() 时被调用。
    用 unset() 清除一个权限上不允许访问或者是不存在的属性时,__unset() 自动执行。
    
  9. __sleep(),执行 serialize() 时,先会调用这个函数,然后才执行序列化操作。这个方法返回一个数组,数组元素就是类属性,可以包括全部的类属性,也可以随便包括其中的几个。
  10. __wakeup(),执行 unserialize() 时,先会调用这个函数,unserialize() 函数可以重新还原一个被 serialize() 函数序列化的对象,__wakeup() 方法则是恢复在序列中可能丢失的数据库连接及相关工作! 因为对象是存储在内存中的,为了提高程序运行效率,当某个对象使用完成之后,就会被垃圾回收机制回收,所以它不可能永久的保存在内存中,这样的话如果其他页面也需要用到这个对象,就比较困难了,这个时候可以把对象利用 serialiaze() 方法序列化,然后保存在到一个或数据库中,这样的话其他页面就可以随时调用了,然后想要删除这个序列化的对象也是很简单的。
    class Person{
        public $name;
        public $sex;
        private $age;
        public function __construct($name,$sex,$age){
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
        }
        public function __sleep(){
        return array('name','age');
        }
        public function __wakeup(){
        $age+=1;
        return $this->name;
        }
    }
    $person = new Person('fxxy','man',28);
    $p1 = serialize($person);
    echo $p1.'<br/>';
    $p2 = unserialize($p1);
    echo $p2->name;
    
  11. __toString(),类被当成字符串时的回应方法
    实例化的对象不可以直接用 echo 输出,但是如果类中有__toString 方法,就可以输出相应的信息。
    
    class B{
        private $host;
        private $dbname;
        private $user;
        private $pwd;
        function __construct($host,$dbname,$user,$pwd){
        $this->host = $host;
        $this->dbname = $dbname;
        $this->user = $user;
        $this->pwd = $pwd;
        }
        public function connect(){
        echo '连接数据库';
        }
        public function gettable(){
        echo '获得表名';
        }
        public function insert(){
        echo '插入数据库';
        }
        function __toString(){
        $method = get_class_methods(__CLASS__);//获得当前类的所有方法(数组形式)
        $methodString = implode('、',$method);
        //return $methodString;//__construct、connect、gettable、insert、__toString
    
        $vars = get_object_vars($this);//获得当前对象的所有属性(数组形式)
        $varsString = implode('、',$vars);
        return $varsString;//localhost、mydb、admin、admin
        }
    }
    $b = new B('localhost','mydb','admin','admin');
    echo $b;//如果类中没有__toString 方法会报错
    
    // 如果没有 toString() 方法,直接输出对象对发生致命性错误。
    // 注意:echo 或 print_r 函数后面直接跟输出的对象,中间不要加其他多余的字符,否则__toString() 方法不会被执行,例如这种情况:echo '输出对象'.$obj;
    
  12. __invoke(),调用函数的方式调用一个对象时的回应方法。
  13. __set_state(),调用 var_export() 导出类时,此静态方法会被调用。
  14. __clone(),当对象复制完成时调用(一个对象克隆另一个对象的时候)。
    __clone() 里边的$this 代表副本中的对象。$that 代表原对象。
    
    class A{
        public $num = 1;
        public function show(){
        echo $this->num;//1
        }
        function __clone(){
        echo ++$this->num;//2
        }
    }
    $a = new A();
    
    $b = $a;
    echo intval($a===$b);//1
    
    echo $a->show();
    $b = clone $a;
    //echo intval($a===$b);//0,内容虽然一样,但是在内存中的地址不同
    
  15. __autoload(),尝试加载未定义的类
    其他的魔术方法都是在类中添加起作用,这是一个唯一不在类中添加的方法。
    只要在页面中使用到一个类,只要用到类名,就会自动将类名传给__autoload() 的参数。
    

    代码示例

    // test.php
    function __autoload($className){
        include $className.'.class.php';
    }
    $one = new OneAction();
    $two = new TwoAction();
    $three = new ThreeAction();
    
    // OneAction.class.php
    class OneAction{
        public function __construct(){
        echo 'oneAction'.'<br/>';
        }
    }
    
    // TwoAction.class.php
    class TwoAction{
        public function __construct(){
        echo 'twoAction'.'<br/>';
        }
    }
    
    // ThreeAction.class.php
    class ThreeAction{
        public function __construct(){
        echo 'threeAction'.'<br/>';
        }
    }
    
    
  16. __debugInfo(),打印所需调试信息

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
24 人气
更多

推荐作者

ambitionlv

文章 0 评论 0

澉约

文章 0 评论 0

hukaixi

文章 0 评论 0

自演自醉

文章 0 评论 0

詹宝成

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文