3

之前的相关问题

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

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

  • 面向对象的基本语法?

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

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

面向对象的优势

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

面向对象的三大特性

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

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

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

PHP面向对象的基本语法

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

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的,就是说其中的方法都没有实现


hizengzeng
177 声望10 粉丝

hizengzeng