首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP构造函数的用途

PHP构造函数的用途
EN

Stack Overflow用户
提问于 2010-06-13 23:42:28
回答 6查看 46.5K关注 0票数 56

我正在处理类和对象类结构,但不是在一个复杂的层次上--仅仅是类和函数,然后在一个地方实例化。

关于__construct__destruct,请非常简单地告诉我:构造函数和析构函数的用途是什么

我知道学校层面的理论解释,但我希望在现实世界中会有一些东西,比如在哪些情况下我们必须使用它们。

请同时提供一个例子。

问候

EN

回答 6

Stack Overflow用户

发布于 2010-06-13 23:48:09

构造函数是在对象初始化(分配内存、复制实例属性等)后执行的函数。其目的是将对象置于有效状态。

通常,处于可用状态的对象需要一些数据。构造函数的目的是在实例化时强制将此数据提供给对象,并禁止任何没有此类数据的实例。

假设有一个简单的类,它封装了一个字符串,并且有一个返回该字符串长度的方法。一种可能的实现是:

class StringWrapper {
    private $str;

    public function setInnerString($str) {
        $this->str = (string) $str;
    }

    public function getLength() {
        if ($this->str === null)
            throw new RuntimeException("Invalid state.");
        return strlen($this->str);
    }
}

为了处于有效状态,此函数要求在getLength之前调用setInnerString。通过使用构造函数,您可以在调用getLength时强制所有实例处于良好状态:

class StringWrapper {
    private $str;

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

    public function getLength() {
        return strlen($this->str);
    }
}

您还可以保留setInnerString,以允许字符串在实例化后更改。

当对象即将从内存中释放时,将调用析构函数。通常,它包含清理代码(例如,关闭对象持有的文件描述符)。这在PHP中很少见,因为PHP会在脚本执行结束时清除脚本持有的所有资源。

票数 52
EN

Stack Overflow用户

发布于 2010-06-13 23:54:23

举一反三:

class Person {
  public $name;
  public $surname;
  public function __construct($name,$surname){
    $this->name=$name;
    $this->surname=$surname;
  }
}

为什么这是有帮助的?因为不是:

$person = new Person();
$person->name='Christian';
$person->surname='Sciberras';

您可以使用:

$person = new Person('Christian','Sciberras');

这样的代码更少,看起来更整洁!

注意:正如下面的回复正确声明的那样,构造函数/析构函数用于各种各样的事情,包括:变量的解/初始化(特别是当值为变量时)、内存解/分配、不变量(可以被超越)和更干净的代码。我还想指出的是,“更干净的代码”不仅仅是“糖”,它还增强了可读性、可维护性等。

票数 42
EN

Stack Overflow用户

发布于 2010-06-14 00:13:23

构造函数在您实例化类的实例时运行。所以如果你有一个Person

class Person {

    public $name = 'Bob'; // this is initialization
    public $age;

    public function __construct($name = '') {
        if (!empty($name)) {
            $this->name = $name;
        }
    }

    public function introduce() {
        echo "I'm {$this->name} and I'm {$this->age} years old\n";
    }

    public function __destruct() {
        echo "Bye for now\n";
    }
}

要演示,请执行以下操作:

$person = new Person;
$person->age = 20;
$person->introduce();

// I'm Bob and I'm 20 years old
// Bye for now

我们可以通过构造函数参数覆盖初始化设置的默认值:

$person = new Person('Fred');
$person->age = 20;
$person->introduce();

// if there are no other references to $person and 
// unset($person) is called, the script ends 
// or exit() is called __destruct() runs
unset($person);

// I'm Fred and I'm 20 years old
// Bye for now

希望这有助于演示构造函数和析构函数在哪里被调用,它们有什么用?

  1. __construct()可以将类成员默认为具有资源或更复杂的数据structures.
  2. __destruct()可以释放诸如文件和数据库句柄之类的资源。构造函数
  3. 通常用于class composition或data
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3032808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档