如何在PHP中访问静态函数中的私有成员
我有以下PHP类如何在PHP中访问静态函数中的私有成员,php,class,static,private,member,Php,Class,Static,Private,Member,我有以下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
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
首先你能做到吗
如果不是,我应该如何声明成员以便在静态函数中访问它
class MyClass
{
private static $MyMember = 99;
public static function MyFunction()
{
echo self::$MyMember;
}
}
MyClass::MyFunction();
请参阅php手册的oop5章节和。在静态方法中,不能使用$this
调用变量,因为静态方法是在“实例上下文”之外调用的
这在。中有明确的说明。这是一个非常晚的回复,但可能会对某人有所帮助
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;
}
}
}
静态还是非静态?
你有没有问过自己这个问题
您不能从内部访问非静态参数/方法
静态方法(至少不使用依赖项注入)
但是,您可以在非静态方法中使用访问静态属性和方法(使用self::
)
性质
特定的属性值是分配给类blueprint还是分配给它的实例(从类创建的对象)?
如果该值与类实例(类对象)不紧密,则可以将其声明为静态属性
private static $objectCreatedCount; // this property is assign to class blueprint
private $objectId; // this property is assign explicitly to class instance
方法
当决定一个方法是静态的还是非静态的时,你需要问自己一个简单的问题。此方法是否需要使用$this
?如果是,则不应将其声明为静态
private static $objectCreatedCount; // this property is assign to class blueprint
private $objectId; // this property is assign explicitly to class instance
仅仅因为你不需要$this关键字就不需要了
自动意味着您应该使某些内容保持静态(尽管
反之亦然:如果您需要$this,请将其设置为非静态)
您是在单个对象上调用此方法,还是在一般情况下在类上调用此方法?如果您不确定使用哪一个,因为这两个都适用于特定的用例,那么请始终使用非静态。它将在将来给你更多的灵活性
好的实践是,如果特定的美国案例变得非常清楚,总是开始将类设计为非静态和强制静态
您可以尝试将参数声明为静态。。。这样您就可以从静态方法访问它,但这通常不是您想要做的。
因此,如果您确实需要从静态方法访问$this
,那么这意味着您需要重新思考/重新设计您的类架构,因为您做得不对。+1-我不知道self关键字。你的代码成功了!谢谢:)你能调用$m->MyFunction()吗如果函数是静态的,你可以这样做,但也许你不应该这样做,因为它掩盖了一个事实,即函数是对象绑定的。我认为只能通过ClassName::FunctionName调用静态函数,而不能通过实例化。无论如何,我有这样的疑问->如果你像案例A)那样声明变量并像echo$MyMember
那样使用它,它对我不起作用。它不应该正常工作?我无法理解您的注释-//local
。据我所知,当您使用“echo$MyMember;”时,它指的是变量的“local scope”(这里是函数),因为我们没有在函数中定义任何“$MyMember”,所以这一行“没有任何结果”…哦!由于您没有提到任何致命错误或其他问题,我认为它会起作用:D.+1,因为需要花时间解释所有案例:)相关: