繁体   English   中英

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

[英]Instantiate an object for all the available functions

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

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

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

谢谢

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

$twitterObj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);

function myFunc()
{
    global $twitterObj;

    $twitterObj->doStuff();
}

更好的选择是注射。

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

我会一直注射。

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

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

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

  getTwitterObj()->doStuff();

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

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

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

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

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

对象的实例保存在变量中,因此受PHP中任何其他变量的相同作用域规则约束 有几种方法可以实现您想要做的事情,但您不能做的是“自动”使其可用于每个功能而无需修改功能。

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

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

选项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);

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

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

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

在这个函数中,变量$myGlobalObject是来自全局范围的变量:它将在函数返回后$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...

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

暂无
暂无

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

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