php手册之类常量

手册目录: 语言参考---类与对象---类常量

参考详情: 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}都会出错.


如有任何错误,请及时联系并改正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值