私有静态方法与静态方法

时间:2012-07-16 00:40:11

标签: php

我理解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让你逃脱这一点。有没有办法强制它抛出错误而不执行

7 个答案:

答案 0 :(得分:32)

静态私有方法提供了一种隐藏类外部静态代码的方法。如果需要使用几种不同的方法(静态或非静态),即代码重用,这可能很有用。

静态方法和静态变量(有时称为类方法和类变量)是一种将代码和数据放入一种命名空间的方法。您还可以将类变量视为附加到类本身的变量,其中(根据定义)只有一个,而不是该类的实例,其中可能有零,一个或多个。类方法和类变量在处理不仅在所有实例中保持相同但实际上 相同的属性时非常有用。

类变量的示例是ORM实体对象中的数据库处理程序。所有实例都是它们自己的对象,但它们都需要访问相同的数据库处理程序来加载和保存自己。

私人与公众是完全独立的品质,我怀疑你磕磕绊绊的是什么。无法调用私有方法,并且无法从类外部的代码访问私有变量。私有方法通常用于在对象上实现必须无法从对象外部访问的“内部”逻辑。实例方法和类方法可能需要这种限制。

私有类方法的示例可以是工厂方法。可能有三个工厂调用用于创建可能与提供的参数不同的对象。然而,大部分操作都是一样的。所以它进入非私有工厂方法调用的private static方法。

答案 1 :(得分:6)

  

我理解静态意味着不需要为该属性/方法实例化对象。

静止的一切都存在。在全球范围内。

  

我也理解这如何适用于公共属性和方法以及公共方法

你确定你已经明白它会创建一个全局变量和一个标准的全局函数吗?

  

我想要了解的是静态私有函数会让你获得什么。

私有只是visibilityDocs的说明符。这样就可以获得可见性控制。

有用吗?取决于用例。

答案 2 :(得分:4)

尽管代码有效,但它会引发严格的标准错误:

  

严格的标准:不应该是非静态方法Beer :: getBeerType()   静态呼叫

所以,在这里你可以使用private static

答案 3 :(得分:4)

这是为了防止其他人消费它。

例如,你有一个Logger静态对象,那么你有两个公共静态方法LogOkLogError,并且两者都来自“内部”方法Log但是你不希望该类的消费者能够直接致电Log

您可以致电Logger::LogOk( "All right." );,但如果Logger::Log( "abc" );是私有的,则无法致电Log

你可以在内部总是从同一个班级中使用它。

答案 4 :(得分:3)

简单地说,如果您在班级的某些private static function函数中重复操作,则可以声明public static

当然,如果你是一个没有经验的程序员或OOP的新手,那么限制对你的代码来说似乎很奇怪。但是像这样的严格声明将使您的代码更清晰,更易于维护。 在大型项目和复杂课程中,您可以欣赏完全对功能的期望,以及完全如何使用它。

这是一个很好的阅读:Single responsibility principleGod 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(...);
}