在PHP中跨类共享类实例

时间:2014-05-12 15:29:53

标签: php class oop object

我正在寻找更好的解决方案。

我想从主脚本开始记录,该脚本调用多个类来执行各种任务。 我希望所有被调用的类共享日志记录实例并将消息添加到日志中。

例如:

主脚本:

<?php

include 'log.php'
include 'classA.php'
include 'classB.php'

// start new logs
$log = new log('my_log_file.log');
$log->addMessage('log added outside any classes');

// continue loggin within other classes

$task_a = new classA($log);

$task_b = new classB($log);

CLASSA:

<?php

class classA {

function __construct($log="") {

  if(is_object($log)) {
    $log->AddMessage("log added from within classA");
  }

}

}

更好的方法是什么?

3 个答案:

答案 0 :(得分:1)

您可以考虑创建Registry类并将日志对象放入其中

<?php

include 'registry.php';
include 'log.php';
include 'classA.php';
include 'classB.php';

// start new logs
$registry = new registry();
$registry->addLogger(new log('my_log_file.log'));
$registry->getLogger->addMessage('log added outside any classes');

// continue loggin within other classes

$task_a = new classA($registry);

$task_b = new classB($registry);

类a.php

<?php

class classA {

function __construct($registry="") {

  if(is_object($registry)) {
    $registry->getLogger()->AddMessage("log added from within classA");
  }

}

}

有什么好处?如果您决定需要将其他对象传递给其他对象(例如数据库连接,应用程序配置或其他对象),则可以简单地修改注册表,添加到注册表新对象(例如addDatabase),并且您将能够在所有对象中建立数据库连接。您已通过Registry对象的类。

当然你可以为某些类对象传递选定的注册表对象而不是整个注册表

答案 1 :(得分:0)

一些不错的回答人,谢谢你。根据我的要求,我坚持使用我原来的东西,因为没有其他建议能更好地匹配我已有的东西。

答案 2 :(得分:-1)

创建一个php Global $ log可能

http://php.net/manual/en/reserved.variables.globals.php