kano个人博客浅谈php对象的应用

kano个人技术博客 php教程 750 次浏览 没有评论

php面向对象是很常用的编程方式,在php教程中,直到php5面世面向对象编程才得到了完整的支持。php中的对象既有普遍的封装、继承、多态性,又有自己一些独特的特性(魔术方法),本篇是对php对象的一个基本介绍。

php对象

一、类的声明

1. 定义对象类

语法:

class <类名> {

<类成员>

}

其中类成员分为成员对象属性和成员方法:

(1) 成员属性:在类中声明的变量称为成员属性,在类中声明变量需要修饰符(var, public, protected, private, static),修饰符是必须的,不写会报一个语法错误。

(2) 成员方法:在类中声明的函数称为成员方法,成员方法可以不加访问修饰符,默认为public。

定义类例子:{

class Person{
    public $name;
    private $age;
    static $sex;
    var $address;

    public function say(){
echo 'name is ' . $this->name;
    }

    function eat(){
        echo 'have a meal';
    }
}

}


2. 实例化对象

当然类只是建立了一个模型,只有按照这个模型实例出来具体的对象,我们才可以使用

语法:

$<objName> = new <className>(<params>);

或者

$<objName> = new <className>;

 

也就是如果方法的构造函数(后面会讲到)无参数的话,实例化可以没有后面的括号。

例:

$p1 = new Person();

 

3. 成员访问

语法:

$<objName> -> <成员属性>

$<objName> -> <成员方法>()

 

注意访问成员属性时前面没有“$”

例:

$p1 = new Person();
$p1->name = '张三';
$p1->say();

结果:

成员访问结果

4. 在成员方法中访问本对象的成员

可以注意到前面定义类的例子中,使用了一个“$this”,访问对象的成员必须通过对象的引用来完成,在方法内部引用本对象的成员,就需要用到“$this”。

二、访问修饰符

上面我们提到了类成员的访问修饰符,具体有private, protected, public 三种:

private:私有,只能在对象内访问

protected:本类和子类有权访问

public:共有,在哪里都可以访问

 对于成员属性来说,还可以用var修饰,效果等同public,但一般不把var称作访问修饰符;成员方法可以不写访问修饰符,默认为public,var不能用来修饰成员方法。

画一张表格会显得更清晰:

修饰符表格

三、构造方法和析构方法

这是类中的两个特殊方法,构造方法是php创建对象完成后第一个被自动调用的方法;而析构方法是在对象销毁之前最后一个被对象自动调用的方法。

1. 构造方法

每个类中都有一个构造方法,如果没有显式声明,则会存在一个默认的没有参数且内容为空对象的构造方法。

每次使用 new 关键字来实例化对象都会自动调用构造方法,不能通过对象引用主动调用构造方法(构造方法修饰符只能是 public)。

语法:

function __construct(<params>){

// code

}

构造方法的通常用途是为对象的属性给一些初始值,如:

function __construct($name = 'default name'){
    $this->name = $name;
}
$p1 = new Person('啦啦啦啦');
$p1->say();

构造方法结果

2. 析构方法

当对内存段中的对象失去引用时,它就不能被访问,也就成为垃圾对象了。通常对象的引用被赋予其他值或是页面运行结束时,对象都会失去引用。php中有一种垃圾回收机制,当对象不能被访问时就会自动启动垃圾回收程序,析构方法正式在垃圾回收程序回收对象之前调用的。

析构方法通常用来完成一些对象销毁之前的清理任务,如关闭资源等。(由于并非所有的类都需要手动的释放资源,所以析构方法并不需要每个类都写)

语法:

function __destruct(<params>){

// code

}

例子:

function __destruct()
{
    echo $this->name . '被释放<br>';
}

脚本运行结束,会打印:

析构方法结果

实际上php对垃圾回收和资源释放做的比较完善,脚本运行完成后资源大多会自动关闭,所以一般不需要主动写__destruct方法,这里只不过是因为它和__construct相对应而主动提一句。

※ 构造方法和析构方法实际上属于php魔术方法中的其中两个,但是他们在对象的新建和销毁有很大的关联,又是最为常见的魔术方法,因此就在这里提及了,有关于魔术方法,将在本站的其他文章中单独介绍。

四、封装性和继承性

1. 封装性

(1) 把对象的全部成员属性和全部成员方法结合在一起,形成一个不可分割的独立单位(即对象)

(2) 信息隐蔽,尽可能隐蔽对象内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部联系

这也是面向对象的基础特性之一,封装性要求开发者只要如何定义类更为合理,这也考研了开发者的抽象能力;而信息隐蔽则要求开发者善用访问修饰符,只把用户需要的属性和接口暴露在外,其余的内部实现不需要让外面知道。

2. 继承性

子类可以继承父类的属性和方法,同时还可以做自己的扩展,这也是面向对象的基础能力。在php中,我们使用extends关键字使子类继承父类:

class Student extends Person {
    public function do_homework() {
        echo '做作业';
    }
}

Student子类在完全继承了Person的属性和方法之外,还定义了一个自己的方法(do_homework)

(1) 子类覆盖父类的方法

子类继承了父类的方法后,假如想修改其中某个方法的实现,就可以覆盖掉父类的方法了,覆盖方法并不需要特殊的语法,只是把方法重新定义一遍即可:

class Person{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    // 父类方法
    public function say(){
        echo 'Person: name is ' . $this->name;
    }
}

class Student extends Person {
    // 子类方法
    public function say() {
        echo 'Student: name is ' . $this->name;
    }
}
$p1 = new Student('张三');
$p1->say();

继承性结果

可以看到运行结果为子类的方法

(2) 调用被覆盖的父类方法

有时候我们并不想完全覆盖掉父类的方法,而是想再其运行后附加进行一些操作,但是这时父类的方法已经被覆盖了,调用需要一个特殊的语法:

public function say() {
    parent::say();
    echo '<br>Student: name is ' . $this->name;
}

继承性结果

这样使用parent::<父类方法名>就可以调用起被覆盖的方法了

五、关键字final, static, const

有时候我们会有一些特殊需求:某个类不想被继承,某个方法不想被覆盖,类中某个属性想给其所有的实例对象使用,想声明常量等,这几个关键词就能帮助我们实现。


1. final

final关键字可以用来修饰类或类方法,但是不能用来修饰类属性

作用:

(1) 使用final标识的类,不能被继承

(2) 在类中用final标识的成员方法,在子类中不能被覆盖

如果试图继承或覆盖,php则会报错

例:

final class FinalClassSimple{
    //some code
}

 

2. static

使用static修饰的属性和方法是属于类而不是属于具体对象的,称为静态变量或静态方法(或类属性类方法,这种称法更容易记住其意义)

比如你建立了一个学生类,其中有一个属性是记录学生的数量的,这样你肯定不希望这个属性是属于学生对象的,而是所有的对象共同的一个属性,也就是学生类的属性。

class Student {
    static $count;

    public function __construct()
    {
        self::$count++;
    }
}
$s1 = new Student();
$s2 = new Student();
$s3 = new Student();
echo Student::$count;

3

打印了一下结果为3,这也是我们想要的。

访问静态成员:<类名>::$<静态属性名>,在类的内部我们还可以使用self::<静态属性名>来访问本类的静态成员,如上面的例子所示。

静态方法的使用和成员类似,如在上面的学生类中再加入一个静态方法:

public static function print_count() {
    echo '学生的数量为:' . self::$count;
}
Student::print_count();

静态方法结果

注意在静态方法中只能访问静态成员,而不能访问一般的类成员,这个很高理解,在静态属性中访问一般成员,程序根本搞不清你想访问具体哪个成员。

 

const

const关键字用来声明类常量,类常量类似于不能改变值的静态变量。例:

class Student {
    const desc = '我是学生类说明';
}
echo Student::desc;

类常量结果

注意声明类常量时不需要用到“$”,使用的时候也是。

3个关键字能用在的地方总结:

final  类,成员方法

static  成员属性,成员方法

const  类属性

今天kano个人技术博客关于php对象属性的介绍就到这么多了,还有很多类似php对象转数组、数组转对象、php对象与字符串之间的转换、php遍历输出打印对象等等教程kano留在以后慢慢和大家分享吧。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Go