PHP面向对象笔记

 PHP面向对象

php是单继承语言不能同时继承两个类

  1. 定义类用class  对象是类的实例化  项目由对象构成
  2. Public 公共类型  所有程序皆可使用

Private 私有类型 只有该类内可以使用

Protected 受保护类型  只有该类或者其子类或者父类可以使用

3.构造方法和析构方法

构造方法发  __contruct  实例类方法的时候自动执行

析构方法         __destruct       注销对象的时候自动执行

也可以手动关闭 unset($var)  手动注销对象

类常量关键字const 定义类里的常量,定义后就不再改变

调用类常量通常用self::常量名来调用 可以不用实例化直接使用

类名::类常量名

  1. 子类方法覆盖父类方法

当子类方法与服了方法重名,子类方法会覆盖父类方法,调用子类方法时不再显示父类同名方法内容

Parent关键字可以调用父类内的方法或属性 例如parent::父类内的方法或属性名

Final关键词写在class 作用是令该类无法被继承

  1. 命名空间namespace 

作用防止不同文件中的方法应用到一个页面时起冲突

使用的时候在对应类页面开头加上namespace 路径名(随意)给两个有同样方法的页面标上不同的命名空间,可避免冲突。引用的时候只需在调用处加上命名空间就可以引用,如果觉得命名空间太长,则可以用use关键字引入不同页面下的方法用as起个别名然后可以直接用别名来引用

 

全局空间包含命名空间  若命名空间内文件要调用全局空间内的东西,则在调用处加上字符 \ 就可以引用。注意命名空间中调用全局空间中的类必须加 \ ,而调用函数或常量的时候可以不加  \ ,因为php命名空间中没有这个类必须要用 \ 才可以到全局空间找需要使用的类,而命名空间中若没有要调用的函数或者变量则php会自动去全局空间寻找

 

  1. 类的自动加载机制
  1. php中一般一个类用一个文件来储存这样引用类时要用多个require/include引用多个类  这样很麻烦,所以用类的自动加载机制来简化这一个过程
  2. 每个类按照类所在文件名定义命名空间,文件名+类名=类所在路径
  1. 方法 spl_autoload_register(function($className){  include ---- })

 

  1. static方法

如果在类里定义static属性  就相当于const了一个类属性或者类方法  可以通过类名直接调用

代表类的对象的是this

代表类的本身的是self

后期绑定static方法  static绑定的都是后期子类,self绑定的是本身

 

  1. 魔术方法

__set($var,$val  调用的时候只需要实例化对象 ,直接给私有变量赋值就可以比如

$实例化对象名->私有属性名=’新变量’

__get($var)             返回私有属性  调用举例$实例化对象名->私有属性名

 

__Isset($var)           判断私有属性是否已经存在 不存在返回ture

 

__unset($var)         删除一个私有属性的方法

 

__call($functionName,$val) 当调用的是实例化方法不存在时就会调用__call方法,避免程序抛错

 

__callStatic($staticFunctionName,$val)  当调用的静态方法不存在时会自动调用callStatic方法,避免程序抛错

 

__invoke($val)  把类方法当作函数调用的时候自动执行这个函数

 

__toString()     打印要输出的类对象时自动调用这个函数

 

__clone()         当调用clone关键字函数时会自动执行__clone()函数

  1. 对象复制

浅拷贝  php中对象的拷贝时浅拷贝,拷贝的物理地址,对物理地址的传递,这样修改其中一个其余的也跟着改变

若想深拷贝类对象,需要在传值时加上c lone 比如$b=clone$a;这样修改一个值其余的不变

深拷贝    php中处了对象之外的普通类型拷贝是深拷贝

 

  1. 类型约束

 class test1{

   

    public function test1(){

        echo 'hello world!';

    }

}

 

function test1(test1 $a){

    $a->test1();

}

$test1=new models\test1();

models\test1($test1);

 

  1. Trait

由于php是单继承语言为了解决这一问题,引入trait关键字,trait相当于方法模板,类要应用的时候直接用use关键词比如use A/use A,B;

trait A{

    public function A(){

        echo'hello ';

    }

}

trait B{

    public function B(){

        echo 'world ';

    }

}

trait C{

    use A,B;

}

 

class test3{

//     use A,B;

    use C;

   

}

 

 

  1. 接口

通俗讲接口是类的模板,类是对象的模板

接口中只写方法名,具体的实现方法由类来完成

我们学的是面向对象思维,但是叫面向接口思维更贴切

接口可以被继承但不能直接被实例化,接口可以多继承

类以此可以实现多个接口

关键词 interface

实现接口关键词implements

 

  1. 抽象类

抽象类类似接口但是抽象类中可以存在已经实现的方法,接口中只能由非实现的方法名

关键词abstract

类直接继承抽象类就可以,但是要实现抽象类中未实现的方法

 

  1. 单例工厂

防止被过多实例化占用空间,确保一个类只能实例化一次

class test5{

    private static $_instance=NULL;

    private function __construct(){

       

    }

    private function __clone(){

       

    }

    public static function getInstance(){

        if(!(self::$_instance instanceof self)){

            self::$_instance=new self();

        }else {

            return self::$_instance;

        }

    }

}

$test1=test5::getInstance();

$test2=test5::getInstance();

var_dump($test1);

var_dump($test2);

 

  1. 工厂模式

工厂模式应用于缓存类Memcache/Redis等缓存类的底层改变

class Memcache{

    public $a=0;

    public function set($a){

        $this->a=$a;

    }

    public function get(){

        return $this->a;

    }

    public function delete(){

        unset($this->a);

    }

}

class test6{

    public static function factory(){

        return new Memcache();

    }

}

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_36558538/article/details/81588858