我的PHP文件中有很多函数。
我需要实例化这个对象$twitterObj = new EpiTwitter(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
并让它可用于文件中的每个函数,我不想在每个函数上重复它。
有办法吗?要实例化此对象而不必将其复制并粘贴到我在文件中的每个函数上?
由于
答案 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
关键字(在上面的链接中记录)选项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...
如果确实需要,只在函数内部使用全局变量。总是尽量避免它。