繁体   English   中英

在PHP中使用静态方法有什么好理由?

[英]What are good reasons to use static methods in PHP?

有没有人有任何使用静态方法而不是动态的好例子?

辛格尔顿:

class SingletonClass {
    private static $instance;
    private function __construct() { }
    public function __clone() {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }
    public static function init() {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }
    // other public, dynamic methods for singleton
}

$singleton = SingletonClass::init();

跟踪实例数:

class CountMe {
    public static $instances = 0;
    public function __construct() {
        CountMe::$instances++;
    }
    public function __destruct() {
        CountMe::$instances--;
    }
}
$a = new CountMe();
$b = new CountMe();
echo CountMe::$instances; // outputs 2

当您不需要访问实例成员时。

数据库连接可以很好地用于静态函数。 您不需要直接访问整个数据库对象,只需要访问连接资源即可。 所以你可以打电话

 $connection = new DatabaseConnection();
 StaticClass::setDatabase($connection);
 $result = StaticClass::getDatabaseConnection()->query();

但是如果您需要稍后访问该类以进行存储或者同一对象的多个实例,那么您不希望变为静态。

您的类现在也位于全局范围内,因此您可以从任何类,任何范围,代码库中的任何位置访问它。

function getUsers()
{
     $users = StaticClass::getDatabaseConnection()->query('SELECT * FROM users');
}

在一个不那么面向代码的性质中,这里是我如何定义静态方法(我将以银行为例):如果您有银行类并且想要开设一个新的银行,您可以使用:

$b = new Bank;

现在让我们假设你想在这家银行增加一名新员工。 只需致电:

$b->addEmployee( 'Person' );

由于您将操作应用于您创建的银行而不是整个银行拥有该公司,因此您使用成员方法。 现在让我们说公司交易一些资产并赚钱。 要更新他们的总金额,您可以这样称呼:

Bank::addToCompanyBalance( 1000000 );

请注意,由于操作不仅仅应用于我们创建的银行,因此我们使用静态方法。

虽然这个例子非常简单,但我喜欢这个比喻。 在更具程序性的意义上,静态成员适用于:

单身

class Singleton
    private static $instance;

    private function __construct() {}
    private function __clone() {}

    public static function getInstance() {
        if( !isset( self::$instance ) ) self::$instance = new IamOne;
        return( self::$instance );
    }
}

创建可能失败的类
防爆。 文件处理程序类可能并不总是想要创建新对象(假设传递的文件不存在或无法打开)。

使用抽象类
某些类可能不希望有实例(例如,解释用户请求的路由器)。 但是,抽象类可以静态调用,因此可以使用静态方法。

示例:使用静态方法创建可能采用不同参数的对象实例。

Class DBConnection
{
    public static function createFromConfiguration(Configuration $config)
    {
        $conn = new DBConnection();
        $conn->setDsn($config->getDBDsn());
        $conn->setUser($config->getDBUser());
        $conn->setPassword($config->getDBPass());

        return $conn;
    }

    public static function newConnection($dsn, $user, $password)
    {
        $conn = new DBConnection();
        $conn->setDsn($dsn);
        $conn->setUser($user);
        $conn->setPassword($password);

        return $conn;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM