gpt4 book ai didi

php - 在方法内部调用构造函数

转载 作者:可可西里 更新时间:2023-11-01 01:09:05 24 4
gpt4 key购买 nike

不知何故,我的思绪远离了当前的问题,我犯了一个可怕的错误..我在一个只初始化类属性的方法中调用了一个父构造函数。或者我......父构造函数的工作是设置 ID 值。好吧,PHP 允许我这样做。但这不就错了吗?看起来我可以用同样的方式调用类自己的构造函数.. 构造函数不是应该只在创建类的实例时才被允许调用吗... 而且它们只在创建实例时被调用..

<?php

class A {

public function __construct() {
echo "Test<br />";
}

}

class B extends A {

public function test() {
parent::__construct();
}

}

$b = new B();
$b->test();

// OUTPUT:
// Test
// Test

?>

编辑:所以结论是 PHP 允许您在方法内调用构造函数,但它实际上什么都不做。另一个“TEST”字符串来自基类的构造函数。

最佳答案

一个词准确描述了情况。

覆盖

发生的情况是,当父类具有诸如 __construct 之类的方法而子类没有该方法时,当在子类上调用该方法时,它会调用父类方法。

例如:

class Parent
{
public function start(){}
}
class Child extends Parent
{

}

如果我调用 Child 类的 start 方法,它会执行 Parent::Start(),但是如果 Child 类有一个名为 Start() 的方法一个将被称为覆盖父版本。

每个类都有一个构造函数方法,php 执行该方法将类编译成一个对象,现在如果类中有一个名为 __construct() 的方法,PHP 会调用内部构造来编译类,然后调用覆盖构造函数。

如果您在子类中没有__construct 方法,PHP 将执行父类__construct

这就是您在对象初始化中得到 2 x Test 的原因。

您唯一应该使用 parent:__cosntruct() 的情况是您的 Child 类需要用户定义的构造函数,您显式调用父构造来准备父对象。

例如:

class Parent
{
public function __construct()
{
//Do work on Parent Class
}
}

class Child extends Parent
{
public function __construct()
{
//Do Work on Child Class

parent::__construct();
}
}

你应该只在子构造函数中调用父构造函数而不是子方法的原因是构造函数应该只被调用一次,这种方式强制执行。

关于php - 在方法内部调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5173874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com