Php 为所有可用函数实例化一个对象

Php 为所有可用函数实例化一个对象,php,Php,我的PHP文件中有很多函数 我需要实例化这个对象$twitterObj=newepitwitter(TWITTER\u CONSUMER\u KEY,TWITTER\u CONSUMER\u SECRET)并使其可用于文件中的每个函数,我不想在每个函数上重复它 有办法吗?要实例化此对象而不必将其复制并粘贴到文件中的每个函数 谢谢通常认为最好的方法是将is作为参数传递给每个函数: function a(EpiTwitter $twitter) { } function b(EpiTwitter $

我的PHP文件中有很多函数

我需要实例化这个对象
$twitterObj=newepitwitter(TWITTER\u CONSUMER\u KEY,TWITTER\u CONSUMER\u SECRET)
并使其可用于文件中的每个函数,我不想在每个函数上重复它

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


谢谢

通常认为最好的方法是将is作为参数传递给每个函数:

function a(EpiTwitter $twitter) { }
function b(EpiTwitter $twitter) { }
懒惰的方法(我建议不要这样做,除非它是一个不大可能增长的小脚本),就是在全局范围内创建它,然后使用global关键字将其拉入函数:

$twitter = ...;
function a() { 
    global $twitter;
    //$twitter is now the twitter from above.
}
  getTwitterObj()->doStuff();
function my_func () {
    global $myGlobalObject;
    // function code
}

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

一个更好的选择是注射

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

我总是使用注入。

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

function myFunc(EpiTwitter $twitterObj)
{
    $twitterObj->doStuff();
}
function getTwitterObj()
{
   static $obj = null;
   if ($obj == null) {
      $obj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
   }
   return $obj;
}
您需要在全局范围内实例化对象,并以某种方式将其“导入”到函数的范围内。为此,您有三个选项:

  • $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);

您可以将实例化包装到函数中,而不是使用
全局

function getTwitterObj()
{
   static $obj = null;
   if ($obj == null) {
      $obj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
   }
   return $obj;
}
您甚至可以在功能中执行此操作:

$twitter = ...;
function a() { 
    global $twitter;
    //$twitter is now the twitter from above.
}
  getTwitterObj()->doStuff();
function my_func () {
    global $myGlobalObject;
    // function code
}
另外,如果您使用的是类,那么可以查看单例模式。

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

$twitter = ...;
function a() { 
    global $twitter;
    //$twitter is now the twitter from above.
}
  getTwitterObj()->doStuff();
function my_func () {
    global $myGlobalObject;
    // function code
}
在该函数中,变量
$myGlobalObject
是全局作用域中的变量:它将在函数返回后生效,可用于其他函数(如果它们声明了同名的
全局
变量)和函数外的所有代码

function getTwitterObj()
{
   static $obj = null;
   if ($obj == null) {
      $obj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
   }
   return $obj;
}
这实际上是一种不好的做法,你应该避免。相反,定义函数以接受一个参数,您每次都会传递该参数。您只需要实例化它一次。例如:

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...

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

从很多方面来说,这只是一个美化了的全球形象,尽管它确实解决了全球形象所带来的一些问题。(对于一个单身汉,我更倾向于成为一个荣耀的全球)。我知道这是一个老问题,但是你应该考虑接受一个答案。