实例化PHP类的更好方法

时间:2017-07-27 08:21:10

标签: php

我有一个只有一个函数的类:

<?php

class EventLog
{

    public function logEvent($data, $object, $operation, $id)
    {
        //Log it to a file...
        $currentTime = new DateTime();
        $time = $currentTime->format('Y-m-d H:i:s');

        $logFile = "/.../event_log.txt";
        $message = "Hello world";

        //Send the data to a file...
        file_put_contents($logFile, $message, FILE_APPEND);
    }

}

然后我有另一个具有许多功能的类,每个人都需要调用上面的方法。要在我完成的每个函数中实例化该类:

$log = new EventLog();
//Then...
$log->logEvent($data, $object, $operation, $id);

问题:我在每个函数中都使用了上面的代码,我想知道的是,如果有一种方法可以为需要它的所有函数实例化一次EventLog类。

2 个答案:

答案 0 :(得分:1)

您可以在脚本的开头(例如)创建单个实例,并将其注入需要它的类的构造函数中。这称为依赖注入。大多数PHP Web框架都使用这一原则。

f = lambda x: 'feature' + str(x + 1)
df = df.join(df.pop('features').str.split(',', expand=True).iloc[:, :3].rename(columns=f))
print (df)

     name feature1 feature2 feature3
0  Python       p1       p2       p3
1    Java       j1       j2       j3
2     C++       c1       c2       c3

答案 1 :(得分:0)

您也可以尝试使用PHP Trait(使用命名空间):

<?php
namespace App\Traits;

trait EventLog
{

    public function logEvent($data, $object, $operation, $id)
    {
        //Log it to a file...
        $currentTime = new DateTime();
        $time = $currentTime->format('Y-m-d H:i:s');

        $logFile = "/.../event_log.txt";
        $message = "Hello world";

        //Send the data to a file...
        file_put_contents($logFile, $message, FILE_APPEND);
    }

}

在你的其他班级:

<?php
namespace App;

// import your trait here
use App\Traits\EventLog;

class OtherClass
{
    use EventLog;

    public function sample() {
        // sample call to log event
        $this->logEvent($data, $object, $operation, $id);
    }

}