如何在php中使用protected static?

时间:2013-06-22 07:46:32

标签: php

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使它们可以访问而无需实例化类。但通常在哪种情况下我们使用受保护的静态?任何人都可以给我一个现实的例子吗?感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

here引用自己:

  

静态类属性对于静态数据非常有用。也就是数据   一个类实例依赖,但它永远不会改变   可能很大。完全假设的例子:

class Database {

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

}
     

让我们假设这个数据库类需要做一些不同的事情   来自数据库并将数据库类型映射到的数据类型   内部类型。要做到这一点,它需要一个类型映射。这张地图永远是   对于Database的每个实例都是相同的,并且由几种方法使用   Database。好吧,为什么不把它变成static属性,这绝不是   修改但只读过?它节省了一点内存,   因为数据在Database的所有实例之间共享。以来   这个数据只能从类本身内部访问   不会创建任何外部依赖项。静态属性应该   永远不会公开访问,从那以后它们只是全球性的   变量。我们已经看到了那里......

     

静态属性也可用于缓存某些数据   一旦计算出类的所有实例,它们就相同   并且可以作为优化轻松地跨实例共享。有   一些这样的实例,这是有用的。静态属性大多数   提出一种优化技术,它们不应被视为一种优化技术   编程哲学。