Board logo

标题: 开始了解 PHP V5 中的对象(3) [打印本页]

作者: look_w    时间: 2018-7-15 14:07     标题: 开始了解 PHP V5 中的对象(3)

在类上下文操作到目前为止,所看到的方法和属性都在对象上下文中进行操作。也就是说,必须使用对象实例,通过 $this 伪变量或标准变量中存储的对象引用来访问方法和属性。有时候,可能发现通过类而不是对象实例来访问属性和方法更有用。这种类成员叫做静态 成员。
要声明静态属性,将关键字 static 放在可见度修饰符后面,直接位于属性变量前面。
下例显示单个静态属性:$iodir,存放用于保存和读取 Dictionary 数据的默认目录的路径。因为该数据对于所有对象是相同的,所以让它可用于所有实例是有意义的。
清单 9. 单个静态 $iodir 属性
1
2
3
4
class Dictionary {
    public static $iodir=".";
    // ...
}




可以使用范围解析操作符来访问静态属性,该操作符由双冒号 (: 组成。范围解析操作符应位于类名和希望访问的静态属性之间。
1
2
print Dictionary:iodir . "\n";
Dictionary:iodir = "/tmp";




正如所看到的,访问该属性无需实例化 Dictionary 对象。
声明和访问静态方法的语法与此相似。再次,应将 static 关键字放在可见度修饰符后。清单 10 显示了两个静态方法,它们访问声明为 private 的 $iodir 属性。
清单 10. 访问 $iodir 属性的两个静态方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Dictionary {
    private static $iodir=".";
    // ...
    public static function setSaveDirectory( $dir ) {
        if ( ! is_dir( $dir ) ||
             ! is_writable( $dir ) ) {
            return false;
        }
        self:iodir = $dir;
    }
    public static function getSaveDirectory( ) {
        return self:iodir;
    }
    // ...
}




用户不再能访问 $iodir 属性目录了。通过创建特殊方法来访问属性,可以确保所提供的任何值是健全的。在本例中,方法在进行分配前检查给定字符串指向可写入的目录。
注意,两个方法都使用关键字 self 和访问解析操作符来引用 $iodir 属性。不能在静态方法中使用 $this,因为 $this 是对当前对象实例的引用,但静态方法是通过类而不是通过对象调用的。如果 PHP 引擎在静态方法中看到 $this,它将抛出致命错误和一条提示消息。
要从类外部调用静态方法,可使用类名加上范围解析符和方法名。
1
2
Dictionary::setSaveDirectory("/tmp");
print Dictionary::getSaveDirectory();




需要使用静态方法有两个重要原因。首先,实用程序操作可能不需要对象实例来做它的工作。通过声明为静态,为客户机代码节省了创建对象的工作量。第二,静态方法是全局可用的。这意味着可以设置一个所有对象实例都可以访问的值,而且使得静态方法成为共享系统上关键数据的好办法。
尽管静态属性通常被声明为 private 来防止别人干预,但有一种方法可以创建只读静态范围的属性,即声明常量。与全局属性一样,类常量一旦定义就不可更改。它用于状态标志和进程生命周期中不发生更改的其他东西,比如 pi 或非洲的所有国家。
用 const 关键字声明类常量。例如,因为 Dictionary 对象的实际实现背后几乎肯定有一个数据库,所以还可以假设项和翻译有最大长度。清单 11 将其设置为类常量。
清单 11. 将 MAXLENGTH 设置为类常量
1
2
3
4
5
class Dictionary {
    const MAXLENGTH = 250;
    // ...
}
print Dictionary::MAXLENGTH;




类常量始终为 public,所以不能使用可见度关键字。这并是问题,因为任何更改其值的尝试都将导致解析错误。还要注意,与常规属性不同,类常量不以美元符号开始。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0