PHP PHP 类中的构造函数

tandy · 2019-11-26 15:43:13 · 热度: 41

通常,你可能希望在创建和撤销对象时执行一些任务。例如,可能希望立即为刚实例化的对象的多个字段赋值。但是,如果必须手工这样做,那么几乎肯定会忘记执行本该完成的任务。面向对象程序设计经过漫长的发展道路,终于可以通过提供一些特殊方法来消除出现这些错误的可能性。这些方法称为构造函数(constructor)和析构函数(destructor),它们将在对象的创建和撤销过程中自动执行。

你通常希望在对象刚刚实例化时初始化某些字段,甚至触发执行某些函数。当然,可以在实例化后立即这么做,不过,如果能自动进行这些操作会更容易。OOP中就有这样一种机制,称为构造函数。很简单,构造函数定义为对象实例化时自动执行的一段代码。OOP 构造函数有一些优点:

  • 构造函数可以接受参数,能够在创建对象时赋给特定的对象字段。
  • 构造函数可以调用类方法或其他函数。
  • 类的构造函数可以调用其他构造函数,包括父类的构造函数。

PHP通过名称__construct来识别构造函数。构造函数声明的一般语法如下:

function __construct([argument1,argument2,…argumentN])
{
    //class initialization code
}

举个例子来说,假设希望立刻使用所提供的ISBN的特定信息来填充某本书的字段。例如,你可能希望知道书名和作者、图书馆里的这本书一共有多少本以及目前有多少本可借。代码如下:

class book
{
    private $title;
    private $isbn;
    private $copies;

    public function __construct($isbn)
    {
        $this->setIsbn($isbn);
        $this->getTitle();
           $this->getNumberCopies();
     }

    public function setIsbn($isbn)
    {
        $this->isbn = $isbn;
    }

    public function getTitle() {
          $this->title = "Codercto Python";
        print "Title: ".$this->title."<br />";
     }

    public function getNumberCopies() {
        $this->copies = "5";
         print "Number copies available: ".$this->copies."<br />";
    }
}
$book = new book("159059519X");

运行结果如下:

Title: Codercto Python
Number copies available: 5

当然,实际的实现可能需要一些更智能的get方法(例如查询数据库的方法),但上面的方法已经能满足我们的要求。实例化书对象时,将自动调用该构造函数,相应地会调用setIsbn()、getTitle()和getNumberCopies()方法。如果知道每当实例化新对象时都会调用某些方法,那么这些方法最好通过构造函数自动调用,而不是尝试你自己手工来调用。

此外,如果要确保这些方法只能在构造函数中调用,就应当将其作用域设置为private,确保无法通过对象或子类直接调用。

调用父类构造函数

PHP不会自动调用父类的构造函数,必须使用parent关键字显式地调用。示例如下:

class Employee
{
    protected $name;
    protected $title;
    function __construct()
    {
          echo "<p>staff constructor called!</p>";
     }
}

class Manager extends Employee
{
    function __construct(){
        parent::__construct();
          echo "<p>Manager constructor called</p>";
    }
}
$employee =new Manager();

执行后的结果:

staff constructor called!
Manager constructor called

如果没有parent::__construct()调用,就只会调用唯一的Manager构造函数,如下:

Manager constructor called

调用无关的构造函数

可以调用与实例化对象没有任何关系的类构造函数,只需在__constructor前面加上类名即可,如下:

classname::__construct();

举个例子,假设前面实例中的Manager和staff类没有继承关系;相反,他们只是同一个库中的两个类。Employee构造函数依然可以在Manager构造函数中调用:

Employee::__construct()

这样调用Employee构造函数将得到与前面相同的结果。

你可能会考虑为什么没有讨论函数重载特性,许多OOP语言都有这个很有用的特性。答案很简单:PHP不支持构造函数重载。

猜你喜欢:
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册