面向对象
1. 类和对象:
类是对象的概念(抽象),对象是类的具体;比如类是一类物品,具体到个体这个个体就是对象;
2. 类和对象的使用
定义类:
Class className {}
使用(实例化):
$obj = New className; // $obj 就是该类的对象;
3. 类的构造方法和析构方法
构造方法: Function __construct() 在类被实例化的时候自动执行;
析构方法: function __destruct() 在类被调用结束后自动执行;
4. 类的继承和final关键字
定义一个类A
Class A{}
定一个类继承A
Class B extends A {}
A是B的父类,B是A的子类.此时B可以调用除私有的和被final定义的其他方法和属性;
Final: 被final定义的类/方法和属性不能被继承;
5. 命名空间(namespace)
Namespace model 是命名空间,要使用命名空间中的类要用use model\className
6. 类的自动加载
Spl_autoload_register(function($className){
Include $className . ’.php’;
})
此时使用外部的类就可以自动加载进来;
New model\User; 就会把model文件夹下User.php加载进来;
7. 类的静态属性和方法(static)
被关键字static定义的是类的静态属性或方法;
类中调用静态属性和方法要使用self:: 不是$this
类外调用无需实例化直接用className::方法名或属性名;
后期绑定:
class User
{
public static $name = 'euan';
public static function job()
{
echo static::$name;
return '程序员';
}
}
class A extends User
{
public static $name = 'yy';
public static function aa()
{
return parent::job();
}
}
Self:: 输出: ‘euan’;
Static:: 输出: ‘yy';
如果父类中是使用self::调用的就是使用父类中的静态属性或方法,
如果是使用static::调用的程序会判断子类是否有重名的属性或方法,如果有使用子类的,如果没有则使用父类的;
8. 魔术方法
__set(): 设置类中不可访问属性时自动调用
public function __set($var, $val){
$this->$var = $val;
}
__get(): 调用类中不可访问属性时自动调用
public function __get($var){
Return $this->$var;
}
__isset(): 检查类中不可访问属性是否存在时自动调用
public function __isset($var){
Return isset($this->$var) ? true : false;
}
__unset(): 销毁类中不可访问属性时自动调用
public function __unset($var){
unset($this->$var);
}
__call(): 调用类中不存在的方法时自动调用
public function __call($func, $params){
Echo ‘方法’.$func.’不存在’;
var_dump($params);
}
__callStatic(): 调用类中不存在的静态方法时自动调用
Public static function __callStatic($func, $params){
Echo ‘静态方法’.$func.’不存在’;
var_dump($params);
}
__invoke(): 当把对象变量当成方法来用的时候自动调用
public function __invoke()
{
echo '把对象变量当方法使用';
}
__toString(): 当把对象以字符串的方式输出的时候自动调用
public function __toString()
{
return '对象字符串输出';
}
9. 浅拷贝与深拷贝
$a = new A; //假如A中的$a = 1;
$b = $a;
$b->a = 2;
Echo $a->a; //结果是2;
$a与$b是公用一个地址的,也就是说其中一个的属性改变另一个也跟着改变,这就是浅拷贝,但不属于引用类型;
$b = clone $a;
$b->a = 2;
Echo $a->a; //结果是1;
把$a的值复制给$b,此时依然是共用一个地址,这里会有一个COW机制,只有发生改变的时候才会另开辟内存空间,俩个对象属性发生改变的时候将不会影响另一个;
$a->a = new B; //假如B中的$b = 0;
$b = $a;
$b->a->b = 1;
Echo $a->a->b; //结果是1;
这里还是浅复制,只有在A中使用__clone()才能深复制
Public function __clone()
{
$this->a = clone $this->a;
}
10. 类型约束
类也可以当成约束类型
Class A{}
Function test(A $a){}
Test(100); //会报错,因为不是A的对象
Test(new A); //正确
11. Trait 实现php多继承
trait A
{
public $a = 'hello ';
}
trait B
{
public $b = 'world ';
}
class Test
{
use A,B;
public function ab()
{
echo $this->a.$this->b;
}
}
$test = new Test;
$test->ab(); //输出结果 hello world;
12. 接口(Interface)
定义: 用关键字interface来定义的类是接口,接口中只用定义方法不需要实现具体内容;
接口中所有的方法都是公用的;
实现: 使用关键字implements继承接口,接口可以多继承,必须实现全部接口;
interface A
{
public function a();
}
interface B
{
public function b();
}
class AB implements A,B
{
public function a()
{
echo 'hello ';
}
public function b()
{
echo 'world';
}
}
$ab = new AB;
$ab->a(); //输出结果 ‘hello’;
$ab->b(); //输出结果 ‘world’;
13. 抽象类
定义: 使用abstract来声明的类是抽象类,一个类中如果有abstract声明的方法不能有方法体,且该类必须是abstract来声明;抽象类中可以写普通方法;抽象类不能被实例化;
实现: 必须实现实现abstract声明的所有方法;
14. 单例模式
防止一个类被多次实例化以达到节省资源的设计模式;
Class A
{
Private statice $_instance = null; //存储实例化对象的变量;
Private function __construct(){} //私有构造方法就代表不可以直接new这个类
Private function __clone(){} //防止clone该类
Public statice function getInsantce() //获取该类的对象
{
If( !(self::$_instance instanceof self) ){ //检查是否已被实例化 instanceof是php 内置函数
Self::$_instance = new self;
}
Return self::$_instance; //如果已经实例化则返回该类的对象;
}
}
$a = new A; //会报错
$a = A::getInstance(); //获取到A的对象多次获取也不会增加内存可以使用 memory_get_usage()查看内存;
15. 工厂模式
建立一个工厂根据需求创建对象,实现动态替换的目的;
Class A
{
Public function set(){}
}
Class B
{
Publlic function set(){}
}
Class Tool
{
Public static function factory()
{
return new A;
}
}
$tool = Tool::factory();
$tool->set();
要更换类只需要在Tool的factory()中把A改成B即可;