43

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

4

7 回答 7

41

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

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

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

私人与公共是完全不同的品质,我怀疑你遇到了什么。不能调用私有方法,也不能从类外的代码访问私有变量。私有方法通常用于在对象上实现不能从对象外部访问的“内部”逻辑。实例方法和类方法都可能需要此限制。

私有类方法的示例可以在工厂方法中。可能有三个工厂调用来创建一个对象,这些对象可能在提供的参数上有所不同。然而,大部分操作是相同的。所以它进入private static了非私有工厂方法调用的方法。

于 2012-07-16T00:54:57.653 回答
7

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

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

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

您确定您已经了解它创建了一个全局变量和一个标准的全局函数吗?

我想了解的是静态私有函数为您带来了什么。

private只是可见性Docs的说明符。因此,您可以获得可见性控制。

有用吗?取决于用例。

于 2012-07-16T01:09:07.850 回答
5

这是为了防止其他人食用它。

例如,您有一个Logger静态对象,然后您有两个公共静态方法LogOkLogError并且都受益于“内部”方法Log,但您不希望该类的消费者能够Log直接调用。

你可以打电话,但如果是私人电话Logger::LogOk( "All right." );,你不能打电话。Logger::Log( "abc" );Log

您可以在内部始终在同一类中使用它。

于 2014-01-11T22:48:37.150 回答
4

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

严格标准:非静态方法 Beer::getBeerType() 不应被静态调用

因此,在这里您可以使用private static.

于 2012-07-16T00:50:46.767 回答
4

简单地说,如果在类中的某些函数中private static function有重复操作,则可以声明a 。public static

如果你是一个缺乏经验的程序员或者是 OOP 的新手,那么对你的代码施加限制自然会显得很奇怪。但是像这样严格的声明会让你的代码更干净,更容易维护。在大型项目和复杂的类中,您可以准确地了解函数的期望以及如何使用它。

这是一个很好的阅读:单一责任原则上帝对象

于 2013-01-11T13:10:54.967 回答
1

这是规则和最佳答案,

静态方法不能访问非静态变量和方法,因为它们需要类的实例。不用担心警告,规则已设置,一旦完全执行,它将在未来破坏您的代码。这就是为什么

static public function BeerInfo() {
            return self::getBeerType()

是错的,

您必须将 getBeerType 声明为静态的。

于 2016-03-03T15:50:47.120 回答
1

在您的示例中,您可以通过执行以下操作来简化此操作。

static private $beertype = "IPA";

static public function BeerInfo() {
   return self::$beertype;
}

“静态”纯粹意味着驻留在单个内存区域中。如果您有记忆力,那么静态实现是一个很好的策略。

当您使用公共静态函数时,大多数情况下您可能不想处理该类的实例,而是想重用该类中预先存在的功能。利用私有静态函数是在没有实例的情况下做到这一点的方法。

但是,您可以有一个公共静态函数,它接受一个作为所述类的实例的参数,例如

static public function doSomething(Beer &$ref) {
   $ref->instanceLevelFunction(...);
}
于 2017-11-29T15:16:22.520 回答