我创建了一个在“__construct”中调用对象的类,如何在整个课程中使这个对象可用。
class SocialMedia { function __construct() { $object = "whatever"; } }
如何从类中的其他函数(它们是静态的)中访问$ object。 我曾尝试使用“$ this-> object”但当我尝试从其他静态函数调用它时,我收到错误“$ this when when not object context”。
答案 0 :(得分:5)
使用
self::$object = 'whatever'
而是阅读PHP Manual on the static
keyword
在旁注statics are death to testability上,您可能会忘记刚学到的内容并改为使用实例变量。
答案 1 :(得分:2)
尝试在类的范围内定义您的对象,就在函数的正上方。所以,作为一个例子:
class SocialMedia { public $object; function __construct() { $object = "whatever"; } }
或者您可以尝试将其定义为“公共静态”而不仅仅是“公共”。例如,这个:
class SocialMedia { public static $object; function __construct() { $object = "whatever"; } }
答案 2 :(得分:2)
让它静止:
class SocialMedia {
protected static $object;
function __construct() {
self::$object = "whatever";
}
}
答案 3 :(得分:1)
如果$object
不是静态的,那么您就遇到了问题。您需要能够引用该类的特定实例。你需要将SocialMedia的实际实例传递给它的静态方法,或者想出一些其他的恶作剧:
public static function someMethod(SocialMedia $instance, $args)
{
// do stuff with $instance->object and $args
}
public function methodThatUsesStaticMethod($args)
{
self::someMethod($this, $args);
}
如果$object
是静态的,那么您可以使用范围解析运算符来访问它,正如其他人提到的那样:
public static $object;
public static function someMethod($args)
{
$object = self::$object;
// do stuff with $object and $args
}
但是你还有另一个问题......如果还没有创建SocialMedia
的实例,那么会发生什么?{/ 1}}尚未设置?
答案 4 :(得分:0)
您可以使您的类成为单例(OOP Patterns in PHP Manual)但如果您想要可测试性和/或依赖注入,那么这确实不是更好的解决方案。无论你如何制作它,你都会追随一个全局变量,迟早你会发现它们带来的所有麻烦。