[英]Extending a PHP Class with Subclasses and instantiate all functions into one object
[英]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.