[TOC] ## 【类/对象】相关函数 > [ 类/对象函数参考](http://php.net/manual/zh/ref.classobj.php) > ### 常用的处理函数 * __NAMESPACE __ ==> 当前命令空间 * __autoload ==> 尝试加载未定义的类 * call_user_method_array ==> 以参数列表的数组,调用用户方法 * call_user_method ==> 对特定对象调用用户方法 * class_alias ==> 为一个类创建别名 * method_exists ==> 检查类的方法是否存在 * class_exists ==> 检查类是否已定义 * interface_exists ==> 检查接口是否已被定义 * * get_called_class ==> 后期静态绑定("Late Static Binding")类的名称 * get_class_methods ==> 返回由类的方法名组成的数组 * get_class_vars ==> 返回由类的默认属性组成的数组 * get_class ==> 返回对象的类名 * get_parent_class ==> 返回对象或类的父类名 * * get_declared_classes ==> 返回由已定义类的名字所组成的数组 * get_declared_interfaces ==> 返回一个数组包含所有已声明的接口 * get_declared_traits ==> 返回所有已定义的 traits 的数组 * get_object_vars ==> 返回由对象属性组成的关联数组 * is_a ==> 如果对象属于该类或该类是此对象的父类则返回 TRUE * is_subclass_of ==> 如果此对象是该类的子类,则返回 TRUE * property_exists ==> 检查对象或类是否具有该属性 * trait_exists ==> 检查指定的 trait 是否存在 * * is_object() 判断是否是个对象 * instanceof 判断一个obj是否属于一个类 > $b instanceof B; * * * * * * ### 魔术方法: 访问不存在或者权限不够的属性的时候,自动触发的魔术方法 * function __get( $name ){ } 获取属性的时候自动触发 * function __set( $name,$value ){ } 设置属性..... * function __isset($name){ } * function __unset($name){ } * function __call( ){ } 访问一个非静态方法 * function __callStatic( ){ } 访问一个静态方法 * function __autoload( ){ } 自动加载 * * spl_autoload_register( callback ); //将用户自定义的加载函数,注册到自动加载机制中 * * function __sleep( ){ } 当对象被当做文件保存时会自动触发的方法 > 该方法要做的事情,就是返回一个需要保存的对象数据的一个数组 > return array($a,$b); > * function __wakeup( ){ } > 当对象是从文件里读出来进行反序列化得到对象的时候,会自动触发的方法 > 用来进行资源的初始化 > #### PHP 5.3以后新增的魔术方法 __invoke() 在创建实例后,可以直接调用对象 ``` <?php class testClass{ public function __construct(){ echo '__construct'; } public function __invoke(){ echo '__invoke'; } } $n = new testClass; $n(); // __construct __invoke ``` __callStatic() 它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,它必须是公共的,并且必须被声明为静态的。 ``` class A { public function __call($name, $args) { } public static function __callStatic($name, $args) { } } ``` ### 序列化 * file_put_contents(‘obj.txt’ , serialize($obj)); ### 反序列化 * unserialize ;将对应的序列化字符串,反过来构造成原来的数据类型。 > $str = file_get_contents(‘obj.txt’) > unserialize( $str ); 反序列化 > ### 接口 作用 :专门用于规范整个项目的设计接口的工具称之为接口 内容:只能是(常量 + 抽象方法) * 定义语法:interface 接口名{ } * 实现接口:implements 接口名{ } * 实现多接口 :class C implements 接口1,接口2{ } * 接口继承接口 :interface 新接口 extends 旧接口{ } ### 对象遍历 对象的遍历其实就是遍历对象的属性(共有属性),利用foreach遍历 * * * * * #### 常见的修饰符: 1. public 2. protected 保护权限(只有自己和子类可以使用) 3. private 私有属性(子类也不可使用) 4. static 静态方法 5. abstract 修饰类(抽象类) > 只能被继承的类,不能被实例化 > 子类必须实现父类的抽象方法 > 用于规范团队协作能力 > 6. final > 修饰类 :该类不能被继承。 > 修饰方法:不允许子类重写 > 7.** 注意 : 子类重写父类方法时,权限一定要比父类开放** #### 构造方法 * __construct( ) { } 相当于JS中的构造函数 #### 晰构方法 * __destruct( ){ } 对象释放前自动调用此函数(用于释放一些资源) #### 继承 extends * 对象->成员 * 类::成员 * parent::成员 常用parent来代替父类类名,来调用父类的方法 * self:: 代表的是当前方法所定义的类空间 * $this 代表当前访问的对象 #### 终止脚本执行 * return die exit * * * * * ## 自动加载类__autoload() 在编写面向对象程序时,常规做法是将每一个类保存为一个PHP源文件。当在一个PHP文件中需要调用一个类时很容易就可以找到,然后通过include(或require)把这个文件引入就可以了。不过有的时候,在项目中文件众多,要一一将所需类的文件include进来,是一个很让人头疼的事。 PHP5提供了一个__autoload()来解决这个问题。当new实例化一个不存在的类时,则自动调用此函数“__autoload()”,并将类名作为参数传入此函数。我可以使用这个实现类的自动加载。 在组织定义类的文件名时,需要按照一定的规则,最好以类名为中心,加上统一的前缀或后缀形成文件名:class_student.php 或 student_class.php 或 student.php ``` // demo.class.php <?php class Demo { function two() { echo "222222222222222<br>"; } } ``` ``` // hello.class.php <?php class Hello { function three() { echo "3333333333333333<br>"; } } ``` ``` // test.class.php <?php class Test { function one() { echo "1111111111<br>"; } } ``` ``` // test.php <?php /* * 只要在这个脚本中, 需要加载类的时候(必须用到类名),就会自动调用这个方法。 */ function __autoload($classname) { echo $classname."<br>"; //Test test.class.php include strtolower($classname) . '.class.php'; } $t = new Test(); $t -> one(); $d = new Demo(); $d-> two(); $h = new Hello(); $h -> three(); World::four(); World::four(); World::four(); World::four(); World::four(); World::four(); ``` ``` // world.class.php <?php class World { static function four() { echo "44444444444444<br>"; } } ```