属性

定义

类的变量成员叫做属性。属性声明是由访问控制关键字 publicprotected 或 private 和一个变量来组成,同时可以加上默认值。

<?php

class A
{
    //只能在类本身使用
    private $a = "Hello";

    //可以在子类和类本身使用
    protected $b = <<<EOT
This is variable b;
EOT;

    //除了子类,类本身,外部也可以访问
    public $c;
}

访问属性

在类的成员方法里面,可以通过 $this-> 加变量名来访问类的属性和方法,但是要访问类的静态属性或者在静态方法要使用 self:: 加变量名。

注意 self:: 这种方式后的变量名需要加 $ 符号,而 $this-> 后的变量名不需要加

<?php 

class A
{
    private $a = "Hello";

    protected $b = <<<EOT
This is property b
EOT;

    public static $c = 'This is a'.' static property';

    public function talk()
    {
        echo $this->a.PHP_EOL;
        echo $this->b.PHP_EOL;
        echo self::$c;
    }
}

(new A())->talk();

结果输出

Hello
This is property b
This is a static property

类常量

我们可以在类中定义常量。常量的值将始终保持不变。在定义和使用常量的时候不需要使用 $ 符号。

<?php

class A
{
    const ENV = 'env';
    const HELLO = 'Hello';
}

接口(interface)中也可以定义常量

<?php

interface B
{
    const ENV = 'ENV';
    public function sayHi();
}

自动加载对象

要进一个类操作时,需要先将该类加载进来,例如 includerequire 等。

如果要执行的类很多,则需要大量 include 操作,会导致重复加载,管理苦难等一系列问题。

在 PHP 5 中,不用这样做了,可以使用 spl_autoload_register() 函数来注册任意数量的自动加载器。

<?php

spl_autoload_register(function ($class_name) {
    include $class_name . '.php';
});

new A();
new B();

本例尝试分别从 A.php 和 B.php 文件中加载 A 和 B 类,相当于

<?php

include 'A.php';
include 'B.php';

new A();
new B();

构造和析构函数

构造函数

void __construct()

创建一个对象时( new 操作),构造函数会自动调用

class A
{
    public function __construct()
    {
        echo 'init...'.PHP_EOL;
    }

    public function sayHi()
    {
        echo "hi";
    }
}

(new A())->sayHi();

输出结果为

init...
hi

实例化 A 的时候执行构造函数。

注意: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。

<?php
class A 
{
   public function __construct() 
   {
       echo "A";
   }
}

class B extends A 
{
   public function __construct() 
   {
       parent::__construct();
       echo "B";
   }
}

new A(); // A
new B(); // AB
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。