Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP5.2中父类中的方法中使用的子类中创建常量?_Php_Inheritance_Constants - Fatal编程技术网

如何在PHP5.2中父类中的方法中使用的子类中创建常量?

如何在PHP5.2中父类中的方法中使用的子类中创建常量?,php,inheritance,constants,Php,Inheritance,Constants,编辑: *注意:不幸的是,我目前正在使用PHP5.2。我找不到一个像样的廉价主机提供5.3 在PHP中,self指定义被调用方法的类。这意味着,如果不重写子类中的方法,即使从子类调用,关键字self也将引用父类 例如,此代码: <?php class ParentClass { const NAME = "ParentClass"; public function showName() { echo self::NAME . "<br />\n"; }

编辑:
*注意:不幸的是,我目前正在使用PHP5.2。我找不到一个像样的廉价主机提供5.3


在PHP中,
self
指定义被调用方法的类。这意味着,如果不重写子类中的方法,即使从子类调用,关键字
self
也将引用父类

例如,此代码:

<?php

class ParentClass {
  const NAME = "ParentClass";
  public function showName() {
    echo self::NAME . "<br />\n";
  }
}

class ChildClass extends ParentClass {
  const NAME = "ChildClass";
  public function __construct() {
    echo self::NAME . "<br />\n";
  }
}

$test = new ChildClass();
$test->showName();

?>
我想做的是创建一个默认方法(例如上面示例中的
showName()
),该方法存在于父类中,其常量定义了要使用的默认值。在child中,我希望能够重写这些常量(注意上面的child定义中的
const
),并在对child实例调用该方法时使用这些值

简而言之,我怎样才能使上面的样本的输出

ChildClass
ChildClass
…而不必在子系统中复制父系统的代码?

尝试

function showName() {
   return static::NAME;
}
它使用:

从PHP5.3.0开始,PHP实现了 称为后期静态绑定的功能 可用于参考 在静态上下文中调用类 继承权

更准确地说,是后期静态绑定 通过将名为的类存储在 最后一个“非转发呼叫”。万一 静态方法调用,这是类 显式命名(通常是 操作符的左侧);万一 在非静态方法调用中,它是 对象的类。“转发” “呼叫”是一个静态的 自我介绍:,家长:, 静态::,或者,如果在类中上升 层次结构,转发\静态\调用()。这个 函数get_调用的_class()可以是 用于检索具有 被调用类和静态类的名称:: 介绍了它的范围

编辑:对于5.2.x


如果你没有5.3.0,你将无法利用这一点。一种常见的黑客解决方案是创建一个由子类名引用的静态缓存(例如,
private static$statics=array()
)。它要求您跟踪对象继承以覆盖_构造上的值,并明确定义哪些静态是“可继承的”。例如,在Sapphire ORM中使用此技术可以绕过PHP静态绑定限制。它们定义了一个、多个和各种静态var管理功能。

我认为适合您的情况的语法是:

print constant(get_class($this)."::NAME");

也许这只是因为你的简短示例,但“自我”引用似乎并不需要

我会这样做:

class ParentClass {
  public function showName() {
    echo $this->name() . "<br />\n";
  }

  public static function name() {
    return "ParentClass";
  }
}

class ChildClass extends ParentClass {
  public function __construct() {
    echo $this->name() . "<br />\n";
  }
  public static function name() {
    return "ChildClass";
  }
}

$test = new ChildClass();
$test->showName();

使用
static::CONSTNAME
将返回正确的值。

我应该更清楚一些,我目前仅限于PHP 5.2。5.3在共享主机上还没有很好的可用性。为什么这个常量可以工作,而它的名字在
static
heritation的上下文中表明了这一点?太棒了!好吧,至少没那么可怕。谢谢对于寻求php5.3及以上解决方案的用户,您可以使用
static::
关键字而不是
self::
。我使用ServerGrove,他们以合理的价格提供5.3托管服务。@CaseySoftware:书签,谢谢。我将不得不查看一些评论等,但它看起来很有希望。我一直计划使用WebPosition,但价格差异看起来不大。WF确实执行5.3,但他们通过在您的帐户下运行另一个Apache、使用RAM等方式来执行—这不一定是我想要的。
class ParentClass {
  public function showName() {
    echo $this->name() . "<br />\n";
  }

  public static function name() {
    return "ParentClass";
  }
}

class ChildClass extends ParentClass {
  public function __construct() {
    echo $this->name() . "<br />\n";
  }
  public static function name() {
    return "ChildClass";
  }
}

$test = new ChildClass();
$test->showName();
ChildClass
ChildClass