Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 私有静态方法与静态方法_Php - Fatal编程技术网

Php 私有静态方法与静态方法

Php 私有静态方法与静态方法,php,Php,我理解static意味着不需要实例化对象,该属性/方法才可用。我还了解这如何应用于私有属性和方法以及公共方法。我想理解的是静态私有函数能给你带来什么。例如: class Beer { static private $beertype = "IPA"; private function getBeerType() { return self::$beertype; } static public function BeerInfo() {

我理解
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可以让您摆脱这种情况。有没有办法强迫它抛出一个错误而不执行?

尽管代码可以工作,但它抛出了一个严格的标准错误:

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


因此,这里您可以使用
私有静态

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

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

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

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

私有类方法的示例可以在工厂方法中。可能有三个工厂调用来创建一个对象,其提供的参数可能不同。然而,大部分操作都是相同的。因此它进入了非私有工厂方法调用的
私有静态
方法

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

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

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

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


我想理解的是静态私有函数能给你带来什么

private只是一个属性的说明符。这样可以获得可见性控制


它有用吗?取决于用例。

简单地说,如果在类中的一些
公共静态
函数中有重复操作,则可以声明
私有静态函数

当然,如果您是一个没有经验的程序员或是OOP新手,那么对代码设置限制似乎很奇怪。但是像这样严格的声明将使您的代码更干净,更易于维护。 在大型项目和复杂类中,您可以准确地了解函数的预期内容以及如何使用函数

这是一本好书:和

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

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

您可以调用
Logger::LogOk(“好的”)但不能调用
Logger::Log(“abc”)Log
是私有的,则为code>


您可以从同一个类内部使用它。

以下是规则和最佳答案

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

static public function BeerInfo() {
            return self::getBeerType()
错了,


您必须将getBeerType声明为静态。

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

static private $beertype = "IPA";

static public function BeerInfo() {
   return self::$beertype;
}
“静态”纯粹是指驻留在单个内存区域中。如果您有内存意识,静态实现是一个很好的策略

当您使用公共静态函数时,大多数情况下,您不希望处理该类的实例,而是希望从该类中重新使用已有的功能。利用私有静态函数是在没有实例的情况下实现这一点的方法

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

static public function doSomething(Beer &$ref) {
   $ref->instanceLevelFunction(...);
}

嗯,我还是不太明白。在我上面的代码中,非静态私有方法是“可用”的,因为它可以从静态公共方法调用。但由于所有私有方法都需要由公共方法调用,所以我仍然不知道显式方法是如何获得任何结果的