面向对象的工具

本文详细介绍了PHP面向对象编程中的魔术方法,如自动加载类文件的`__autoload()`方法、错误处理的`__call()`方法、对象引用打印的`__toString()`方法以及克隆对象时自动调用的`__clone()`方法。同时,阐述了PHP反射API的作用,包括获取类的转储信息、内置类库信息以及类中特定元素的方法。
PHP通过类和方法等语言结构支持面向对象编程。同时也通过对象相关的函数和内置类为面向对象提花广泛的支持。

1. OOP的魔术方法

 __autoload()内置方法来自动包含类文件。
 当遇到试图实例化未知类的时候,会调用__autoload()方法,并将类名当作参数传递给它。
 好处:类文件不需要一一引入;要实例化类的时候才引入,避免资源的浪费;不会漏掉哪个类。
    function __autoload($_className){
        require_once strtolower($_className).'.class.php';
    }
    $computer = new Computer();
    $person = new Person();
    echo $computer->_name;
    $computer->_run();

__call()内置方法在类方法调用错误时自动调用并屏蔽错误显示。
    class Computer{
        function _run(){
            echo '运行';
        }

        //采用__call()方法屏蔽调用
        public function __call($_methodName,$_argList){
            echo $_methodName.'()方法不存在';
            var_dump($_argList);
        }
    }

    $computer = new Computer();
    $computer->_go();

__toString()内置方法来打印对象的引用。当打印对象的时候自动调用该方法。它必须返回一个字符串。
    class Computer{

        //打印对象的引用
        private function __toString(){
            return '我是对象上的字符串';
        }
    }

    $computer = new Computer();
    echo $computer;

引用传递是两个或以上引用共用一个对象;独立实例是每个引用对应独立的对象。
使用克隆对象方法,会连带克隆被克隆对象的字段值,它在调用这个方法的时候会自动调用__clone()方法(该方法不能私有化private),处理新克隆出来的那个对象的参数值等。

    class Computer{
        public $_name = 'dell';

        public function __clone(){
            echo '克隆啦';
            $this->_name = '联想';
        }
    }

    $computer1 = new Computer();
    $computer2 = clone $computer1;
    echo $computer1->_name;
    echo $computer2->_name;

2.检测类函数

class_exists()函数检测类是否存在。
<?php
    class Computer{

    }
    //1.检测类是否存在
    echo class_exists('Computer');
?>

get_class()函数获取对象的类名。
    class Computer{

    }
    $computer = new Computer();
    echo get_class($computer);

get_class_methods()方法获取类中的公有方法,参数可以使用类名或者对象引用。
    class Computer{
        public function _run(){}
        private function _go(){}
    }
    $computer = new Computer();
    print_r(get_class_methods('Computer'));//参数还可以用$computer

get_class_vars()函数获取类中的公有字段,参数要是类名,对象引用不行。
    print_r(get_class_vars('Computer'));

get_parent_class()函数获取子类的父类,如果没有返回false。它的传递参数对象引用或者类名都可以。
    echo get_parent_class($notecomputer);

interface_exists()函数判断接口是否存在。
    echo interface_exists('Person');

is_a()函数判断对象是是否是这个类或者是这个类的子类的。
    echo is_a($notecomputer, 'Computer');

is_subclass_of()函数判断对象是否是类的子类。
    echo is_subclass_of($notecomputer, 'Computer');

method_exists()函数判断对象中是否有这个方法。
    echo method_exists($computer, '_run');

3.OOP的反射API

PHP类和对象函数并没有告诉我们类内部的所有一切,而只是报告了它们的公有成员。要充分了解一个类,需要知道其私有成员和保护成员,还要知道其方法所期望的参数。对此,使用反射API。
获取反射API的转储信息:
    $rc = new ReflectionClass('Computer');
    print_r(Reflection::export($rc));

获取内置的类库信息:
    Reflection::export(new ReflectionClass('DateTime'));

获取类里某个元素:
    $rc = new ReflectionClass('DateTime');
    echo $rc->getName();//类名
    echo $rc->getFileName();//类存储地址
    print_r($rc->getConstants());//类常量信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值