Php 如果父类中不存在子类函数,则调用子类函数
我有如下代码--Php 如果父类中不存在子类函数,则调用子类函数,php,class,Php,Class,我有如下代码-- 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的实例时。。。它
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。。。is应该调用它,而不是父类的函数f
但不管怎样,它调用的是父类函数,就像从父类的构造函数调用的一样,与子类/上下文无关:这实际上是一个非常有趣的问题 所以,据我所知,你在问这是否正确,请说: 可以调用扩展父类的类的函数吗 是的,你可以。。。在某种程度上,如果子对象中的方法是静态的 以这个例子为例,为了简单起见,我没有在构造器中使用它,但它也可以在那里使用:
class ClassA {
public function testMeAsWell() {
return ClassB::testMe();
}
}
class ClassB extends ClassA {
static function testMe() {
return 'do something';
}
}
$child = new ClassB();
echo $child->testMe();
// outputs 'do something'
$parent = new ClassA();
echo $parent->testMeAsWell();
// also outputs 'do something'
这项工作的原因需要更多的研究,但作为一个猜测,我会说,因为PHP是编译的,所以它在运行时将了解这两个类,因此将能够了解我们希望它做什么
所以,进一步说,您希望使用变量。可以,但它们也必须是静态的
您想在_中调用未在类中定义的方法。这表明CartItem类是一个抽象概念,您不打算实例化它,因为CartItem的实例可能不包含项目所需的足够信息或行为
抽象概念是使用定义尽可能多的抽象方法实现的,并定义要在扩展它的具体类中实现的抽象方法。方法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
}
}
复制听起来像是当m被实例化时,可以在CartItem的构造函数中调用to-meprotected函数f。@modsfabio,不是重复的,而是相反的scenario@TusharSharma怎么样,伙计?我在寻找这样一个东西,你有,正是我想做的,但如果我定义了静态,这意味着我将无法定义任何类属性:静态方法只是一个具有时髦名称的全局函数。@Alice如果你不能有静态,那么不,你就不能这样做。我现在已经这样做了:无论如何,谢谢。但另一个层次的复杂性,我不希望它是抽象的,若子类定义了它,那个么就接受子类的函数,或者从父类本身获取它,我不明白。您可以在基类中定义方法,并在需要时在子类中重新定义它$此->f始终调用正确的实现子类的实现,如果存在,则调用基类的实现,否则调用基类的实现。如果没有在基类中定义方法f,那么正确的实现是将其抽象,因为它无论如何都无法实例化。您可以在基类中不定义f,也可以在调用它之前不使该类抽象和使用,但这是一种攻击。我修改了这个问题只是出于好奇:是否调用了u构造?声明var$v;是PHP4语法。PHP5在一个类声明中。但是PHP4不关心_构造;它不是构造函数,而是PHP4中的常规函数。阅读更多关于和摆脱var的内容。顺便说一句,我希望您没有使用PHP4。