为所有可用功能实例化一个对象

时间:2011-12-26 21:29:41

标签: php

我的PHP文件中有很多函数。

我需要实例化这个对象$twitterObj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);并让它可用于文件中的每个函数,我不想在每个函数上重复它。

有办法吗?要实例化此对象而不必将其复制并粘贴到我在文件中的每个函数上?

由于

5 个答案:

答案 0 :(得分:1)

一个简单的解决方案是使用global关键字。

$twitterObj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);

function myFunc()
{
    global $twitterObj;

    $twitterObj->doStuff();
}

更好的选择是注射。

function myFunc(EpiTwitter $twitterObj)
{
    $twitterObj->doStuff();
}

我会一直注射。

答案 1 :(得分:1)

您可以将实例化包装在函数中,而不是使用global

function getTwitterObj()
{
   static $obj = null;
   if ($obj == null) {
      $obj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
   }
   return $obj;
}

您甚至可以在您的功能中执行此操作:

  getTwitterObj()->doStuff();

此外,如果您正在使用类,则可以查看Singleton模式。

答案 2 :(得分:0)

通常被认为是“最佳”方式是将每个函数作为参数传递:

function a(EpiTwitter $twitter) { }
function b(EpiTwitter $twitter) { }

懒惰的方式(我建议反对这个,除非它是一个不太可能增长的小脚本),只是在全局范围内创建它,然后使用global关键字将其拉入函数:

$twitter = ...;
function a() { 
    global $twitter;
    //$twitter is now the twitter from above.
}

答案 3 :(得分:0)

对象的实例保存在变量中,因此受PHP中任何其他变量的the same scoping rules约束。有几种方法可以实现您想要做的事情,但不能做的是让它“自动”地用于每个功能而不修改功能。

您需要在全局范围内实例化对象,并以某种方式将其“导入”到函数的范围内。为此,您有三个选择:

  • $GLOBALS数组(在上面的链接中记录)
  • global关键字(在上面的链接中记录)
  • 将对象作为argument
  • 传递

选项1和2大多被认为是“不良做法”,因为它们会使程序流程更加混乱,它们不具有特别的可扩展性,并且它们不会提升在其他项目中重用代码的能力。执行此操作的“最佳”方法是将对象作为参数传递。

选项1:

$twitterObj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);

function my_func () {
  $twitterObj = $GLOBALS['twitterOjb'];
  // do stuff
}

选项2:

$twitterObj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);

function my_func () {
  global $twitterObj;
  // do stuff
}

选项3:

$twitterObj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);

function my_func ($twitterObj) {
  // do stuff
}

my_func($twitterObj);

答案 4 :(得分:0)

http://php.net/manual/en/language.variables.scope.php

您可以将变量声明为函数内的全局变量:

function my_func () {
    global $myGlobalObject;
    // function code
}

在这个函数中,变量$myGlobalObject是一个来自全局范围的变量:它将在函数返回后继续,可用于其他函数(如果它们声明了一个同名的global变量)并且函数外的所有代码。

这实际上是一种不好的做法,你应该避免它。相反,定义您的函数以接受每次都会传递的参数。您只需要实例化一次。一个例子:

function my_func_a ( $myObj ) {
    // function code
}

function my_func_b ( $myObj ) {
    // function code
}

// the actual script...
$twitterObj = new EpiTwitter( TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET );
my_func_a( $twitterObj );
my_func_b( $twitterObj );
// etc...

如果确实需要,只在函数内部使用全局变量。总是尽量避免它。