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
- 3.2.5 PHP类常量的局限
- JAVA反射修改常量,以及其局限
- JAVA反射修改常量,以及其局限
- JAVA反射修改常量,以及其局限
- php类常量的使用详解
- PHP 的 __FILE__ 常量
- PHP 的 __FILE__ 常量
- PHP 的“魔术常量”
- PHP 的“魔术常量”
- PHP的常量
- Php的魔术常量
- PHP的常量
- php的系统常量
- php常量的使用
- PHP 的 __FILE__ 常量
- PHP 5 常量
- PHP 5 常量
- php中的类常量
- 周一
- 温州出资培训“富二代” 每人补贴8800元
- PHP优化技巧一例
- JS 对象介绍
- 运用JS将搜索的关键字高亮显示
- 3.2.5 PHP类常量的局限
- ASP 内建对象
- 网店宣传秘籍!!!
- 程序员最痛苦的.......
- 谈谈线程及线程的几种状态
- openssh升级及配置操作步骤(转)
- Dev 控件的心得
- spring rmi代理性能
- 软件测试基础 转自51Testing