3.2.5 PHP类常量的局限

来源:互联网 发布:linux google 五笔 编辑:程序博客网 时间:2024/04/30 13:54

    如果类常量能完全听命于我们(do our bidding)还是相当不错的,但是其不驯之处还是早早地暴露出来了。类常量的值只能在定义时设置,并且不能在类的方法中定义。常量只能被初设成普通值(plain value)不能被设置成对象。甚至在定义类常量时,不能使用字符连接。

    正如前面提到的,不能改变常量的值,即使你在测试的时候希望如此也不行。那么我们该怎么办呢?

    使用类变量来替代类常量

    最简单且显而易见的方法是用类变量来代替类常量,比较典型的是public类型的。因为变量可以在定义之后被改变,我们可以在method中给它赋值,就可以把对象赋给变量,也能在赋值前先完成若干我们需要的处理。不过实现起来需要一些小技巧。如果在构造函数中来实现,那么在有对象之前,这个变量是不能被使用的(因为它还没有值),当然我们可以在类声明之后,马上弄出一个对象来补救。还有一个办法,就是定义一个类方法来初始化类变量。假设我们用到二个mysql数据库rbac和cms,

class Connections {
    public static $RBAC;
    public static $CMS;
    public static function init() {                 //译者注原文此处没有static
        self::$RBAC =
            new mysqli('localhost','user','password','rbac');  //译者注:此处变量里存放了对象
        self::$CMS =
            new mysqli('localhost','user','password','cms');
    }
}
Connections::init();
     尽管这段代码看上去比较丑陋且笨拙,但是它的确能用。而且我们还能进一步把变量设为私有的,并加上静态访问的方法。
public static function getRbac() { return self::$RBAC; }
public static function getCms() { return self::$CMS; }


用方法代替常量
一个只读的类方法也许是常量的很好的一个替代品。而且它们可以被写得几乎一模一样,就象用Person::DBTABLE()去替换Person::DBTABLE:
public static function DBTABLE() { return 'Persons'; }
这很简单,甚至在PHP4中也行得通。在方法中,我们的限制少得多。例如,连接使得我们写长的SQL语句更规范。我们可以这样做:
class UserMapper {
    public static function sqlSelect($id) {
        "SELECT user_id,email,password,firstname,lastname,".
        "username,role+0 as roleID FROM Users WHERE id = $id";
    }
}
类变量和类常量是在PHP5中才引入的,而类方法在PHP4中就可以用了,尽管那时还没有正式类方法的声明,也无法阻止一个类方法被拿来当成实例方法使用。这种情形也出现在抽象类身上。在PHP4中,一个普通的类可以被当作抽象类来使用--即只拿来当父类,而从不实例化这个类。而在PHP5中,抽象类可以直接被声明了。

3.3 ABSTRACT CLASSES AND METHODS (FUNCTIONS)

抽象类是PHP5中新引入的。它既有概念价值也有实用价值,这在本书中还要深入探讨。先来看看抽象类到底能做什么。
3.3.1 抽象类和方法
使一个类成为一个抽象类很简单,只要在class前加上abstract关键字就行了。这样这个类就不被允许生成实例。你就不能写以以下代码:
abstract class Foo {}
$foo = new Foo;
如果这样写,就会出现以下的错误提示:
Cannot instantiate abstract class Foo

原创粉丝点击