2
protected static $table = array(
            'createQuery' => 'CREATE TABLE IF NOT EXISTS `xf_user_notes` (
            `note_id` int(10) NOT NULL AUTO_INCREMENT,
            `given_user_id` int(10) NOT NULL,
            `received_user_id` int(10) NOT NULL,
            `note_message` VARCHAR(255) NOT NULL,
            `note_date` int(11) NOT NULL,
              PRIMARY KEY (`note_id`)
        ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;',
            'dropQuery' => 'DROP TABLE IF EXISTS `xf_user_notes`'
    );

以上代码取自一个网站。

问题:

我知道:protected 只能在类本身中访问,也可以通过继承类和父类访问。static 使它们无需实例化即可访问。但是通常在什么情况下我们使用受保护的静态?谁能给我一个活生生的例子?谢谢。

4

2 回答 2

0

不能在静态方法内部调用非静态方法(不实例化类)。protected static 将使其无法从外部类访问,但仍可从公共静态方法访问。这可能是将代码的复杂部分分解成更易于维护的块,或者如果在另一个静态方法中存在狭窄的重用。

于 2013-06-22T07:56:11.907 回答
0

从这里引用自己:

静态类属性对静态数据很有用。也就是说,类实例所依赖的数据,但永远不会改变并且可能很大。完全假设的例子:

class Database {

    protected static $types = array(
        'int'    => array('internalType' => 'Integer', 'precision' => 0,      ...),
        'string' => array('internalType' => 'String',  'encoding'  => 'utf-8', ...),
        ...
    )

}

让我们假设这个数据库类需要对来自数据库的不同类型的数据做一些事情,并将数据库类型映射到内部类型。为此,它需要一个类型映射。对于 的每个实例,此映射始终相同,Database并由 的多个方法使用 Database。好吧,为什么不让它成为一个static属性,它永远不会被修改而只会被读取呢?它节省了一点内存,因为数据在所有Database. 由于数据只能从类本身内部访问,因此不会创建任何外部依赖项。静态属性永远不应该公开访问,因为那时它们只是全局变量。我们已经看到了它的去向......

静态属性也可用于缓存一些数据,这些数据在计算后在类的所有实例中都是相同的,并且可以作为优化轻松地在实例之间共享。在某些情况下,这很有用。静态属性主要是一种优化技术,它们不应该被视为一种编程哲学。

于 2013-06-22T08:21:57.927 回答