PHP面试考点---9. 面向对象

面向对象

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即可;

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值