我在PHP中有以下类
class MyClass
{
// How to declare MyMember here? It needs to be private
public static function MyFunction()
{
// How to access MyMember here?
}
}
我对使用哪种语法感到困惑
$MyMember = 0;
和echo $MyMember
或
private $MyMember = 0;
和echo $MyMember
或
$this->MyMember = 0;
和echo $this->MyMember
有人可以告诉我该怎么做吗?
我在OOPS中并不强大。
你能在第一时间做到吗?
如果没有,我该如何声明该成员以便我可以在静态函数中访问它?
答案 0 :(得分:63)
class MyClass
{
private static $MyMember = 99;
public static function MyFunction()
{
echo self::$MyMember;
}
}
MyClass::MyFunction();
请参阅php手册的oop5章节中的Visibility和Scope Resolution Operator (::)。
答案 1 :(得分:9)
这是一个超级迟到的回应,但它可以帮助某人......
class MyClass
{
private $MyMember;
public static function MyFunction($class)
{
$class->MyMember = 0;
}
}
有效。您可以通过这种方式访问私有成员,但如果您有$ class,则应该将MyFunction作为该类的方法,因为您只需调用$ class-> MyFunction()。但是,您可以拥有一个静态数组,每个实例都添加到类构造函数中,此静态函数可以访问并迭代,更新所有实例。即..
class MyClass
{
private $MyMember;
private static $MyClasses;
public function __construct()
{
MyClass::$MyClasses[] = $this;
}
public static function MyFunction()
{
foreach(MyClass::$MyClasses as $class)
{
$class->MyMember = 0;
}
}
}
答案 2 :(得分:2)
在静态方法中,您不能使用$this
调用变量,因为静态方法是在“实例上下文”之外调用的。
PHP doc中明确说明了这一点。
答案 3 :(得分:2)
<?php
class MyClass
{
// A)
// private $MyMember = 0;
// B)
private static $MyMember = 0;
public static function MyFunction()
{
// using A) // Fatal error: Access to undeclared static property:
// MyClass::$MyMember
// echo MyClass::$MyMember;
// using A) // Fatal error: Using $this when not in object context
// echo $this->MyMember;
// using A) or B)
// echo $MyMember; // local scope
// correct, B)
echo MyClass::$MyMember;
}
}
$m = new MyClass;
echo $m->MyFunction();
// or better ...
MyClass::MyFunction();
?>
答案 4 :(得分:0)
您曾经问过自己这个问题吗?
您不能从内部访问非静态参数/方法 静态方法(至少在没有不使用依赖注入的情况下如此)
但是,您可以使用非静态方法(使用
self::
)中的with访问静态属性和方法
是将特定的属性值分配给类蓝图还是分配给实例(从类创建的对象)? 如果该值与类实例(类对象)不紧密,则可以将其声明为静态属性。
private static $objectCreatedCount; // this property is assign to class blueprint
private $objectId; // this property is assign explicitly to class instance
在决定将方法设为静态还是非静态时,您需要问自己一个简单的问题。此方法需要使用$this
吗?如果确实如此,则不应将其声明为静态。
仅仅因为您不需要$ this关键字就不会 自动意味着您应该使某些内容静态化(尽管 相反是正确的:如果您需要$ this,请将其设为非静态)。
您一般是在单个对象或类上调用此方法吗?如果由于两者都适合特定用例而不确定使用哪一种,那么请始终使用非静态。将来会为您提供更大的灵活性。
优良作法是总是开始将您的类设计为非静态的,并在特殊情况下将其强制设为静态。
您可以尝试将参数声明为静态...只是为了可以从静态方法访问它,但这通常不是您想要执行的操作。
因此,如果您确实需要从静态方法访问$this
,则意味着您需要重新考虑/重新设计类架构,因为您做错了。