【PHP】面向对象编程

以前的相关问题

  • 面向对象和面向过程的差异,各自的优缺点程序员

  • 面向对象有哪些基本特性?各自特性带来哪些好处设计模式

  • 面向对象的基本语法?函数

  • 面向对象的基本特性的基本实现this

  • 面向对象结合各类设计模式的使用设计

面向对象的优点

易维护、易复用、易扩展,因为面向对象有封装、继承、多态性的特性,能够设计出低耦合的系统,使系统更加灵活、更加易于维护code

面向对象的三大特性

  • 封装:也就是把客观事物封装成抽象的类,而且类能够把本身的数据和方法只让可信的类或者对象操做,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操做这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据能够是私有的,不能被外界访问。经过这种方式,对象对内部数据提供了不一样级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。对象

  • 继承:是可让某个类型的对象得到另外一个类型的对象的属性的方法。它支持按级分类的概念。在 OOP中,继承的概念很好的支持了代码的重用性(reusability),也就是说,咱们能够向一个已经存在的类中添加新的特性,而没必要改变这个类。这能够经过从这个已存在的类派生一个新类来实现。这个新的类将具备原来那个类的特性,以及新的特性。而继承机制的魅力和强大就在于它容许程序员利用已经存在的类(接近须要,而不是彻底符合须要的类),而且能够以某种方式修改这个类,而不会影响其它的东西继承

  • 多态:多态就是指一个类实例的相同方法在不一样情形有不一样表现形式。多态机制使具备不一样内部结构的对象能够共享相同的外部接口。这意味着,虽然针对不一样对象的具体操做不一样,但经过一个公共的类,它们(那些操做)能够经过相同的方式予以调用接口

PHP面向对象的基本语法

  • 声明一个类:
    使用一个class关键字,提供一个类的名字,而后列出这个累的实例应该具有的方法和属性get

class MyClass{
    ...    //属性列表
    
    ...    //方法列表
}

new关键字和构造函数
类的实例使用new关键字建立。

$zhangsan = new Person();

上面的代码建立了Person类的实例,当调用new的时候PHP会分配一个新的对象,而且从你定义的类中拷贝属性和方法,而后若是你定义了对象的构造函数的话,它会被自动调用,它在new关键字建立一个对象后自动裕兴。构造函数一般被用来自动执行不少初始化操做。构造函数也接收参数


使用$this变量访问方法和属性
在对象的方法执行时,PHP会自动定义一个叫$this的特殊变量,他表示一个对对象自己的引用

$this->name;     //访问$name非静态属性(注意别在属性的名字前面加$符号)
$this->getName();    //调用类的非静态方法

public,protected和private属性和方法


静态属性
静态属性和常规属性不同,静态属性属于类自己而不属于类的任何势力。静态属性使用static关键字定义。
访问一个静态属性:使用类名或者使用特殊的类名self来访问它,self是一个方法所属的类的缩写。

print MyClass::$staticName;
print self::$staticName;    //在类的方法中调用

静态方法
静态方法是类的一部分,不属于类的任何实例。静态方法中不能使用任何$this,由于静态方法跟实例无关。

class_name::method();
self::method();

类的常量
与静态成员类似,它们属于类自己而不属于类的实例。类的常量对大小写敏感。

class MyClass{
    const RED = 'red';
    
    function color(){
        return self::RED;
    }
}
print MyClass::RED;
$obj = new MyClass();
$obj->color();

多态

class Cat{
        public function miau(){
            print 'miau';
        }
    }

    class Dog{
        public function waff(){
            print 'waau';
        }
    }

    function makeSound($obj){
        if($obj instanceof Cat){
            $obj->miau();
        }else if($obj instanceof Dog){
            $obj->waff();
        }else{
            print "Error:Pass wrong kind of object!";
        }
        print "\n";
    }

    makeSound(new Cat());
    makeSound(new Dog());

上面的例子是不能够扩展的,想增长第三个动物声音时,不得不在makeSound()函数中增长esleif语句。能够使用多态解决这个问题

class Animal{
        public function makeSound(){
            print "Error:should implemented class";
        }
    }

    class Cat extends Animal{
        public function makeSound(){
            print 'miau';
        }
    }

    class Dog extends Animal{
        public function makeSound(){
            print 'waau';
        }
    }

    function makeSound($obj){
        if($obj instanceof Animal){
            $obj->makeSound();
        }else{
            print "Error:Pass wrong kind of object!";
        }
        print "\n";
    }

    makeSound(new Cat());
    makeSound(new Dog());

抽象类 abstract
若是类中定义了抽象方法,那么这个类必须定义为抽象类,抽象类中的抽象函数没有被实现,因此不是一个完整的类,因此不能实例化抽象类的。
若是一个类继承了抽象类,那么这个类必须实现抽象类的抽象方法


接口 interface

interface Loggable{
    function logString();
    
    function logErr();
}

接口中的方法都是abstract的,就是说其中的方法都没有实现

相关文章
相关标签/搜索