[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>";
}
}
```