Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/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_Class_Oop_Static_Late Static Binding - Fatal编程技术网

Php 为什么要返回新的静态?(菲律宾)

Php 为什么要返回新的静态?(菲律宾),php,class,oop,static,late-static-binding,Php,Class,Oop,Static,Late Static Binding,为什么有些开发人员创建一个返回新静态数据的方法?使用返回新静态值的方法的原因是什么我不是在问静态和自我之间有什么区别,或者静态和自我是什么意思。例如,这里有一个简单的类: <?php class Expression { public static function make() { return new static; } public function find($value) { return '/' .

为什么有些开发人员创建一个返回新静态数据的方法?使用返回新静态值的方法的原因是什么我不是在问静态和自我之间有什么区别,或者静态和自我是什么意思。例如,这里有一个简单的类:

<?php

class Expression
{
    public static function make()
    {
        return new static;
    }


    public function find($value)
    {
        return '/' . $value .'/';
    }

    public function then($value)  
    {
        return $this->find($value);
    }

    public function hi($value)  
    {
        return "hi";
    }

}

这样做的目的是什么?我看到这里我们没有使用新的表达式语法,如果这是重点,那么为什么不让所有方法都是静态的呢?区别是什么,为什么有一个方法返回新的静态(而其他方法不是静态的)?

newstatic
从当前类实例化一个新对象,并使用后期静态绑定(如果类是子类,则实例化子类,我希望您理解这一点)

在类上使用
静态
方法返回同一类的新实例是另一种构造函数。也就是说,您的构造函数通常是
公共函数uuu construct
,并且通常需要一组特定的参数:

class Foo {
    public function __construct(BarInterface $bar, array $baz = []) { ... }
}
拥有替代构造函数允许您提供不同的默认值或方便快捷方式来实例化此类,而无需提供这些特定参数和/或能够提供替代构造函数将转换为规范参数的不同参数:

class Foo {

    public function __construct(BarInterface $bar, array $baz = []) { ... }

    public static function fromBarString($bar) {
        return new static(new Bar($bar));
    }

    public static function getDefault() {
        return new static(new Bar('baz'), [42]);
    }

}
现在,即使您的规范构造函数需要一组复杂的参数,您也可以创建一个类的默认实例,这对于大多数使用可能都很好,只需使用
Foo::getDefault()

PHP中的典型示例是
DateTime

在您的具体示例中,替代构造函数实际上没有做任何事情,因此它是相当多余的,但我认为这是因为它是一个不完整的示例。如果确实存在一个替代构造函数,它除了
新静态
,什么都不做,那么它可能只是作为
(new Foo)->
上的方便语法,我觉得这是有问题的。


答案的可能重复清楚地解释了差异。@Ankur Tiwari我不是在问静态和自我之间的区别,或者静态和自我做什么。@jeyoung我的问题不是关于新自我和新静态之间的区别…@PeraMika看起来你不明白
新静态()的目的。
,但是如果你这样做了。。。这是重复使用的。您可以在单个基类中定义static
make
方法,并且从派生类中获得相同的功能。现在我理解了它的用途,非常感谢!我猜构造器真的是空的,这只是为了糖。可能开发人员更喜欢通过这种方式调用新对象来实现它们。所以不要写:
$search=(新表达式)->find(“哇”)
,他可以写
$search=Expression::make()->find(“哇”)
。当然是一样的。这不是问题的真正答案,但仍然有用,清楚地显示了自我和静态的区别。@sergeyshuchkin伟大的例子。。。如果没有更多的描述,它会更有帮助
class Foo {

    public function __construct(BarInterface $bar, array $baz = []) { ... }

    public static function fromBarString($bar) {
        return new static(new Bar($bar));
    }

    public static function getDefault() {
        return new static(new Bar('baz'), [42]);
    }

}
class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B