我在php.net上看到了这个例子:
<?php
class MyClass {
const MY_CONST = "yonder";
public function __construct() {
$c = get_class( $this );
echo $c::MY_CONST;
}
}
class ChildClass extends MyClass {
const MY_CONST = "bar";
}
$x = new ChildClass(); // prints 'bar'
$y = new MyClass(); // prints 'yonder'
?>
但$ c :: MY_CONST仅在5.3.0或更高版本中被识别。我写的课可能会分发很多。
基本上,我在ChildClass中定义了一个常量,MyClass(父类)中的一个函数需要使用常量。有什么想法吗?
答案 0 :(得分:80)
如何使用static::MY_CONST
?
答案 1 :(得分:10)
自php 5.3:
使用static::MY_CONST
有关static
在这种情况下,the keyword static
是对实际调用的类的引用。
这说明了static $var
,static::$var
和self::$var
之间的区别:
class Base {
const VALUE = 'base';
static function testSelf() {
// Output is always 'base', because `self::` is always class Base
return self::VALUE;
}
static function testStatic() {
// Output is variable: `static::` is a reference to the called class.
return static::VALUE;
}
}
class Child extends Base {
const VALUE = 'child';
}
echo Base::testStatic(); // output: base
echo Base::testSelf(); // output: base
echo Child::testStatic(); // output: child
echo Child::testSelf(); // output: base
另请注意,关键字static
有两个完全不同的含义:
class StaticDemo {
static function demo() {
// Type 1: `static` defines a static variable.
static $Var = 'bar';
// Type 2: `static::` is a reference to the called class.
return static::VALUE;
}
}
答案 2 :(得分:4)
而不是
$c = get_class( $this );
echo $c::MY_CONST;
这样做
$c = get_class( $this );
echo constant($c . '::MY_CONST');
答案 3 :(得分:0)
我无法使用const来打印“yonderyonder”(这是关于常量的东西,它们不会改变),但它适用于var:
<?php
class MyClass {
var $MY_CONST = "yonder";
public function __construct() {
echo $this->MY_CONST;
}
}
class ChildClass extends MyClass {
var $MY_CONST = "bar";
}
$x = new ChildClass(); // prints 'bar'
$y = new MyClass(); // prints 'yonder'
?>
答案 4 :(得分:0)
如果您需要访问可以使用reflection的常量,属性,类或对象的方法,它会提供有关对象结构的更多详细信息。
例如:
class MainClass
{
const name = 'Primary';
public $foo = 'Foo Variable';
}
class ExtendedClass extends MainClass
{
const name = 'Extended';
}
/**
* From Class Name
*/
//get reflection of main class
$mainReflection = new ReflectionClass('MainClass');
if($mainReflection->hasConstant('name'))
var_dump($mainReflection->getConstant('name'));//Primary
//get reflection of extended class
$extendedReflection = new ReflectionClass('ExtendedClass');
if($extendedReflection->hasConstant('name'))
var_dump($extendedReflection->getConstant('name'));//Extended
/**
* From Objects
*/
$main = new MainClass();
$extended = new ExtendedClass();
//get reflection of main class
$mainReflection = new ReflectionObject($main);
if($mainReflection->hasConstant('name'))
var_dump($mainReflection->getConstant('name'));//Primary
//get reflection of extended class
$extendedReflection = new ReflectionObject($extended);
if($extendedReflection->hasConstant('name'))
var_dump($extendedReflection->getConstant('name'));//Extended