Php静态方法与标准函数

时间:2017-07-14 17:55:06

标签: php oop

我正在开发一个Web应用程序并首次编写基于纯OOP的PHP。我有一个关于静态方法VS标准函数的问题:

以下是一个示例场景:

class Session{

    public function start_new_session(){

        session_start();
        //other code here like token generator

    }


}

VS

class Session{

    static function start_new_session(){

        session_start();
        //other code here like token generator

    }


}

问题

  1. 两者有什么区别?
  2. 哪个更适合我的情况?
  3. 任何申请? (我的意思是,使用静态方法和标准函数的最佳方案是什么)
  4. 我的研究:

    我花了一些时间找到答案,但没有找到相关的答案,但我找到了很多辩论和有用的材料。相信我对于像我这样的初学者来说,决定(谁是对/错?)是非常困难的:

    1. In this question有人说,在静态功能中使用Cookie是个可怕的想法而有人说这是一个好主意

    2. in this question:每个人都在谈论性能,一些专家说,静态函数执行得更快,有些人说;功能更快。由于不同版本的php,结果也各不相同。

    3. 一些有用的统计信息:

      PHP 5.2 :静态方法快〜10-15%。

      PHP 5.3 :非静态方法快〜15%

      PHP 5.4 :静态方法快〜10-15%

      PHP 5.5 :静态方法快〜20%

1 个答案:

答案 0 :(得分:2)

要调用非静态方法,您需要实例化该类(使用new关键字创建该类的新实例)。

在拨打静态方法时,您不必“新建”#34;但它不能直接访问任何非静态属性或方法。有许多用例/场景,您可能希望使用其中一个。

说实话,我从来没有想过要考虑表现使用一个而不是另一个,好像它达到了一个显着差异的地步(并且所有已经采取了主要措施来提高效率)然后我会想象这样一个大型应用程序的维护成本将超过提高效率的需要,或者应用程序背后的逻辑开始时存在相当大的缺陷。

静态和非静态的示例

如果我要在你的问题中使用一个类作为示例,那么我将使用静态版本,因为该方法中的任何内容都不依赖于该类的其他属性,然后您不必实例化它:

Session::start_new_session()

VS

$session = new Session();

$session->start_new_session();

此外,您还可以在类上使用静态属性,该类将记住在使用非静态属性和实例化时本来会丢失的状态:

class Session
{
    protected static $sessionStarted = false;

    static function start_new_session()
    {
        if (!static::$sessionStarted) {
            session_start();
            static::$sessionStarted = true;
        }
    }
}

然后即使你做了:

$session = new Session();

$hasStated = $session::sessionStarted;

$hasStarted仍为true

你甚至可以这样做:

class Session
{
    protected static $sessionStarted = false;

    public function __construct()
    {
        $this->startIfNotStarted();
    }

    function startIfNotStarted()
    {
        if (!static::$sessionStarted) {

            session_start();

            static::$sessionStarted = true;
        }
    }
}

这样您就不必担心自己启动会话,因为它会在您实例化类时启动,而且只会发生一次。

你不想使用这种方法,但如果你有类似Person类的东西,每次数据会有所不同,你不想在差异中使用相同的数据实例

class Person
{
    protected $firstname;

    protected $lastname;

    public function __construct($firstname, $lastname)
    {
        $this->firstname = $firstname;
        $this->lastname = $lastname;
    }

    public function getFullname()
    {
        return "{$this->firstname} {$this->lastname}";
    }
}

//

$person1 = new Person('John', 'Smith');
$person2 = new Person('Jane', 'Foster');

$person1->fullname(); // John Smith
$person2->fullname(); // Jane Smith

如果您要为此课程使用静态方法/属性,那么您只能拥有一个人

class Person
{
    protected static $firstname;

    protected static $lastname;

    static function setName($firstname, $lastname)
    {
        static::$firstname = $firstname;
        static::$lastname = $lastname;
    }

    static function getFullname()
    {
        return static::$firstname . ' ' . static::$lastname;
    }
}

//

Person::setName('John', 'Smith');
Person::setName('Jane', 'Foster');

Person::getFullname(); //Jane Foster

辩论

你可能会看到很多关于什么是更好的辩论以及什么是PHP的最佳实践(不仅仅是静态和非静态方法)。虽然我不会陷入困境!如果您发现一方对您更有意义(以及您当时建造的任何一方),那么请选择那一方,但标准和选项会在此社区中一直发生变化,而一半的问题在5年前就会出现问题(或甚至更少)今天实际上将是非问题。以Laravel框架为例 - 其中一个(很多)辩论是Facades很糟糕,因为它们是静态的并且使用难以测试和调试的魔法,外墙非常容易测试并使用堆栈跟踪错误报告,根本不需要调试。

话虽如此,如果你发现大多数人都在说同样的话并且对另一方真的没有辩论,那么可能有一个原因,我建议你更多地考虑它(例如不要使用mysql_函数或不在循环中运行查询。

希望这有帮助!