我有一个代码如下---
class CartItem{
var $v;
function __construct(){
$this->f();
}
function f(){
echo 'In parent';
}
}
class m extends CartItem{
function f(){
echo 'In child';
}
}
new m();
现在在创建m()的实例时...它没有任何构造函数,所以它正在调用父类构造函数。现在里面调用了一个函数f。
我想要的是 - 如果类m()定义了函数f()...则应该调用它而不是父类的函数f()。
但无论如何它调用父类函数,因为它是从父的构造函数调用的,不管子类/上下文:(
答案 0 :(得分:1)
您希望在__construct()
中调用未在类中定义的方法。这表明CartItem
类是一个抽象概念而您并不打算实例化它(因为CartItem
的实例可能不包含足够的信息或行为项目)。
抽象概念是使用abstract class实现的,它尽可能地定义,并定义要在扩展它的具体类中实现的抽象方法。方法f()
是一种无法在抽象概念中定义的方法,必须在扩展它的每个类中定义:
abstract class CartItem
{
public function __construct()
{
$this->f();
}
abstract protected function f();
}
class m extends CartItem
{
protected function f()
{
// Implement behaviour specific to this class
}
}
答案 1 :(得分:0)
这实际上是一个非常有趣的问题。
所以,据我所知,你问(如果这不对,请说):
你可以调用一个扩展父母的类的功能吗?
是的,如果孩子中的方法是静态的,你可以......那样。
举个例子(为了简单起见,我没有在构造函数中使用它,但它也可以在那里工作):
public function beforeAction($action)
{
//your code
if (Yii::$app->getRequest()->getMethod() === 'OPTIONS') {
parent::beforeAction($action);
Yii::$app->getResponse()->getHeaders()->set('Content-Type', 'text/plain');
Yii::$app->end();
}
return parent::beforeAction($action);
}
这个工作的原因需要更多的研究,但我想说,因为PHP是编译的,它会在运行时知道这两个类,因此能够弄清楚我们想要它做什么。 / p>
所以,进一步说,你想要使用变量。是的,你可以,但他们也必须是静态的。