我理解static
意味着不需要实例化对象以使该属性/方法可用。我也理解这如何适用于私有属性和方法以及公共方法。我想要了解的是静态私有函数会让你获益。例如:
class Beer {
static private $beertype = "IPA";
private function getBeerType() {
return self::$beertype;
}
static public function BeerInfo() {
return self::getBeerType();
}
}
print Beer::BeerInfo() . "\n";
私有方法getBeerType()
在没有实例化对象的情况下执行得很好,只要它是从静态公共方法调用即可。如果静态公共方法可以访问所有私有方法(静态和非静态),那么声明方法静态私有有什么好处?
如果启用了严格的错误报告,我会收到警告,我应该使getBeerType()
成为静态,尽管它仍然允许我运行代码。我做了一些研究,似乎其他语言(Java)会强制您在静态公共方法调用时将私有方法声明为静态。看起来像PHP让你逃脱这一点。有没有办法强制它抛出错误而不执行?
答案 0 :(得分:32)
静态私有方法提供了一种隐藏类外部静态代码的方法。如果需要使用几种不同的方法(静态或非静态),即代码重用,这可能很有用。
静态方法和静态变量(有时称为类方法和类变量)是一种将代码和数据放入一种命名空间的方法。您还可以将类变量视为附加到类本身的变量,其中(根据定义)只有一个,而不是该类的实例,其中可能有零,一个或多个。类方法和类变量在处理不仅在所有实例中保持相同但实际上 相同的属性时非常有用。
类变量的示例是ORM实体对象中的数据库处理程序。所有实例都是它们自己的对象,但它们都需要访问相同的数据库处理程序来加载和保存自己。
私人与公众是完全独立的品质,我怀疑你磕磕绊绊的是什么。无法调用私有方法,并且无法从类外部的代码访问私有变量。私有方法通常用于在对象上实现必须无法从对象外部访问的“内部”逻辑。实例方法和类方法可能需要这种限制。
私有类方法的示例可以是工厂方法。可能有三个工厂调用用于创建可能与提供的参数不同的对象。然而,大部分操作都是一样的。所以它进入非私有工厂方法调用的private static
方法。
答案 1 :(得分:6)
我理解静态意味着不需要为该属性/方法实例化对象。
静止的一切都存在。在全球范围内。
我也理解这如何适用于公共属性和方法以及公共方法
你确定你已经明白它会创建一个全局变量和一个标准的全局函数吗?
我想要了解的是静态私有函数会让你获得什么。
私有只是visibilityDocs的说明符。这样就可以获得可见性控制。
有用吗?取决于用例。
答案 2 :(得分:4)
尽管代码有效,但它会引发严格的标准错误:
严格的标准:不应该是非静态方法Beer :: getBeerType() 静态呼叫
所以,在这里你可以使用private static
。
答案 3 :(得分:4)
这是为了防止其他人消费它。
例如,你有一个Logger
静态对象,那么你有两个公共静态方法LogOk
和LogError
,并且两者都来自“内部”方法Log
但是你不希望该类的消费者能够直接致电Log
。
您可以致电Logger::LogOk( "All right." );
,但如果Logger::Log( "abc" );
是私有的,则无法致电Log
。
你可以在内部总是从同一个班级中使用它。
答案 4 :(得分:3)
简单地说,如果您在班级的某些private static function
函数中重复操作,则可以声明public static
。
当然,如果你是一个没有经验的程序员或OOP的新手,那么限制对你的代码来说似乎很奇怪。但是像这样的严格声明将使您的代码更清晰,更易于维护。 在大型项目和复杂课程中,您可以欣赏完全对功能的期望,以及完全如何使用它。
这是一个很好的阅读:Single responsibility principle和 God Object
答案 5 :(得分:1)
这是规则和最佳答案,
静态方法无法访问非静态变量和方法,因为这些需要该类的实例。不要担心警告,规则已设置,并且一旦完全执行,它将在未来破坏您的代码。这就是为什么
static public function BeerInfo() {
return self::getBeerType()
错了,
你必须将getBeerType声明为静态。
答案 6 :(得分:1)
在您的示例中,您可以通过执行以下操作来简化此操作。
static private $beertype = "IPA";
static public function BeerInfo() {
return self::$beertype;
}
'static'纯粹意味着驻留在单个记忆区域中。如果你有记忆意识,静态实现是一个很好的策略。
当您使用公共静态函数时,大多数情况下,您可能不希望处理该类的实例,但希望重新使用该类中的预先存在的功能。利用私有静态函数是没有实例的方法。
但是,您可以使用一个公共静态函数来接受一个参数,该参数是所述类的一个实例,例如
static public function doSomething(Beer &$ref) {
$ref->instanceLevelFunction(...);
}