手册目录: 语言参考---类与对象---类常量
参考详情: https://secure.php.net/manual/zh/language.oop5.constants.php
评论部分:
1. by ryan@derokorian.com
constant常量的访问限制总是public,你不能声明为private或者protected.
2. by tmp.4.longoria@gmail.com
你可以在抽象类中定义constant,并且在继承它的子类中声明相同的constant,通过不同的类名进行区分调用,如下例:
<?php abstract class dbObject { const TABLE_NAME='undefined'; public static function GetAll() { $c = get_called_class(); return "SELECT * FROM `".$c::TABLE_NAME."`"; } } class dbPerson extends dbObject { const TABLE_NAME='persons'; } class dbAdmin extends dbPerson { const TABLE_NAME='admins'; } echo dbPerson::GetAll()."<br>";//output: "SELECT * FROM `persons`" echo dbAdmin::GetAll()."<br>";//output: "SELECT * FROM `admins`" ?>
3. by delete.this.and...gt@kani.hu
你可以使用延迟静态绑定来区分调用constant,如下:
<?php class A { const MY_CONST = false; public function my_const_self() { return self::MY_CONST; } public function my_const_static() { return static::MY_CONST; } } class B extends A { const MY_CONST = true; } $b = new B(); echo $b->my_const_self() ? 'yes' : 'no'; // output: no echo $b->my_const_static() ? 'yes' : 'no'; // output: yes ?>
4. by Joshua Dickerson
Joshua提出类中的constant会实现到每个类实例中,如果你的类有100个constant,每个占100比特,同时又创建了100个类实例,那么你将占用100*100个比特.当然这是一种假想的情况,但是你还是需要思考,当你创建类常量的时候,是否每个类的实例都会需要用到这个常量.
同时Anonymous(不知道是谁)提出了质疑,他进行了实例测试,如下:
<?php class SomeClass { const thing = 2351253523535; const thing1 = 11423523424; const thing2 = 11423523424; const thing3 = 11423523424; const thing4 = 11423523424; const thing5 = 11423523424; const thing6 = 11423523424; } $m0 = memory_get_usage(); $p0 = new SomeClass(); $p1 = new SomeClass(); $p2 = new SomeClass(); $m1 = memory_get_usage(); printf("memory %d<br />", $m1 - $m0); //output memory 712 ?>最后输出的memory之差是712,但是如果减少SomeClass中的constant数量,结果还是712,没有变化.如果把constant改为public变量,结果就随着变量个数增加呈现递增状态,并且最小为712,这里本人没有深究,只是提一下,如果谁有兴趣,可以去自行验证!
5. by jakub.lopuszanski@nasza-klasa.pl
跟3不同的是,在如下的例子中,self起到了延迟绑定static的作用,如下例:
<?php class A{ const X=1; const Y=self::X; } class B extends A{ const X=2; } var_dump(B::Y); // int(2) var_dump(A::Y); // int(1) ?>如果把上面的self换成static,会发生错误,提示不能在编译时间里使用static,也就是说const Y=self::X会进行编译,那么对于B类,self会变成B.A类中self会变成A.
6. by Paul
中括号可以用来提取字符串中的某个字符,但是你不可以像这样$constant[num/key]来使用,会error,如下例子:
<?php class SomeClass { const SOME_STRING = '0123456790'; public static function ATest() { return self::SOME_STRING[0]; //error } } ?>
7. by riku@helloit.fi
你也可以在constant函数中得到constant变量,这样你可以使用变量来表示类名和常量名,如下:
<?php function get_class_const($class, $const){ return constant("$class::$const"); } class Foo{ const BAR = 'foobar'; } $class = 'Foo'; echo get_class_const($class, 'BAR'); //'foobar' ?>
如果你不使用constant()函数,而直接return $class::$const将会出错,或者你这样return $class::$$const或者return $class::{$const}都会出错.
如有任何错误,请及时联系并改正!