Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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、OOP、静态_Php_Oop_Static - Fatal编程技术网

PHP、OOP、静态

PHP、OOP、静态,php,oop,static,Php,Oop,Static,我在学习PHP,OOP,我在静态, 这时我不明白这句话 静态调用非静态方法会生成E_严格级别警告。 我明白上面的句子只适用于方法(不适用于属性), 但我没能真正理解它, 我很高兴能给我看一下解释上面句子的代码, 祝你一周愉快。以下是一个例子,说明你所问的句子的意思 考虑以下带有一个方法的类(它不是静态的) 这是输出: 严格标准:不应使用非静态方法测试::方法() 在第12行的/obj.php中静态调用 你好,来自method 正如您所看到的,当调用static时,它确实执行了该方法,尽管它不是

我在学习PHP,OOP,我在静态, 这时我不明白这句话

静态调用非静态方法会生成E_严格级别警告。
我明白上面的句子只适用于方法(不适用于属性), 但我没能真正理解它, 我很高兴能给我看一下解释上面句子的代码,
祝你一周愉快。

以下是一个例子,说明你所问的句子的意思

考虑以下带有一个方法的类(它不是静态的)

这是输出:

严格标准:不应使用非静态方法测试::方法() 在第12行的/obj.php中静态调用
你好,来自method

正如您所看到的,当调用static时,它确实执行了该方法,尽管它不是静态方法,但是显示了一条严格的错误消息

如果方法
method()
引用了关键字
$this
,则会遇到致命错误,因为在静态方法调用的上下文中不存在
$this
。因此,虽然在技术上可以静态调用非静态类方法,但不应该这样做

编辑:


您甚至可以静态调用非静态类成员的原因是,在类方法的上下文中,PHP4中不存在static关键字,因此,如果您在PHP4中设计静态类或方法,则没有关键字指示它,您只需以静态方式调用它。现在,如果方法是静态调用的,但声明中没有static关键字,PHP5将发出警告。

如果方法是非静态的,则表示它属于类的实例。例如,如果我们有一个类
Car
,其方法名为
getDamage()
(该方法计算汽车的损坏程度),那么您不应该以静态方式调用此方法

您应该只创建
Car
类的实例,并在该实例上调用
getDamage()
。这是有道理的,因为一辆车可能损坏25%,而另一辆车可能损坏70%


但是以静态方式调用
getDamage()
毫无意义:静态方法不属于类的特定实例,而是属于类本身。而
Car
类没有有用的方法为
getDamage()
提供结果。您仍然可以计算一个值(可能是
0
),但它没有意义。

这是因为即使您可以静态调用非静态方法,您也不应该这样做,它将被记录

class Foo {
    function bar(){
        print "you should not do that";
    }
} 
Foo::bar()
实际上可以工作,但是你会得到一个E\u STRICT警告,因为你可以这样做,但是你不应该这样做

class Foo
{
    public static $my_static = 'foo';
    public $my_non_static = 'bar';

    public function staticValue() {
        return self::$my_static;
    }

    public function nonStaticValue() {
        return self::$my_non_static;
    }
}

print Foo::$my_static . "\n"; // OK
print Foo::staticValue(). "\n"; // E_STRICT

print Foo::$my_non_static . "\n"; // Fatal
print Foo::nonStaticValue(). "\n"; // Fatal
printfoo::$myu静态。“\n”正常-静态访问静态属性

printfoo::staticValue()。“\n”
提供了静态访问的E_STRICT-非静态方法,但不是致命错误,因为此方法不访问非静态属性


另外两个给出了致命错误,因为无法静态访问非静态字段。

它告诉您,如果您在未初始化的情况下调用非静态方法,我会给出一个E_STRICT警告。你到底不明白什么?静态意味着您可以在不将类初始化为对象的情况下调用该方法。关于OOP和静态调用,您应该了解的最重要的一点是它们不会混合使用。静态调用是过程编程思维的一部分。感谢你们的回答,我现在正在阅读它们。当你们说非静态字段时,你们的意思是,值不是定义为静态字段中的静态值?关于E_STRICT,不仅仅因为它是访问非静态属性,我可以返回简单的字符串,我不需要self:$x_static_prop。当我说非静态字段时,我指的是属性,定义时没有static关键字。对不起,我不明白你的第二句话。谢谢你,鲁本,我现在明白你的意思了,关于我的第二句话,我的意思是我可以做回“你好”;而不是self:$static_prop.所以这不仅仅是“因为这个方法不访问非静态属性”,你能用其他的话解释一下吗?我的意思是,如果这个方法访问非静态属性,它只能非静态地访问(通过一个实例)。'Hellow’不是静态属性,它只是一个常量值。所以你们可以在静态方法中使用它。谢谢你们的解释,非常好的逻辑解释。谢谢你们,你们的最后一行真的澄清了事情。
class Foo
{
    public static $my_static = 'foo';
    public $my_non_static = 'bar';

    public function staticValue() {
        return self::$my_static;
    }

    public function nonStaticValue() {
        return self::$my_non_static;
    }
}

print Foo::$my_static . "\n"; // OK
print Foo::staticValue(). "\n"; // E_STRICT

print Foo::$my_non_static . "\n"; // Fatal
print Foo::nonStaticValue(). "\n"; // Fatal