gpt4 book ai didi

PHP:为什么我会收到有关静态属性的错误?

转载 作者:可可西里 更新时间:2023-11-01 13:36:38 34 4
gpt4 key购买 nike

http://codepad.viper-7.com/I0Zqoi

我不明白这有什么问题或如何解决它或为什么。对编程了解一点的人可以解释一下幕后发生的事情,比如在解释器层面吗?另外,我该如何解决我的问题,为什么我需要按照更正的方式编写我的代码?你能用人类的语言告诉我这有什么问题以及如何让它变得更好吗?我想我的书解释得不好,里面的代码也不起作用。 :/谢谢。

class A 
{
private $foo = 'bar';
function read()
{
echo self::$foo;
}
}

$a = new A();
a::read();

Strict Standards: Non-static method A::read() should not be called statically in /code/I0Zqoi on line 13

Fatal error: Access to undeclared static property: A::$foo in /code/I0Zqoi on line 8

唯一的解决方法似乎是在方法前面添加“static”。显然,非静态方法不能通过静态方式访问(例如,类 A{function read(){echo "whatever"};} 不能通过 a::read() 访问,因为 -> 运算符是必需的)。此外,对象代码不能访问静态属性,即使它们存在于函数中(例如,class A{static $variable; function read(){echo $this->variable};} a->read(); won ' 不起作用,因为 -> 运算符用于访问调用静态属性的函数。)。通过将方法和属性都更改为静态,可以通过静态方式访问该方法。通过将方法和属性都更改为非静态,可以通过对象实例化来访问其中任何一个。调试器抛出错误对我来说没有意义,因为我的书说可以通过对非静态方法的目标代码调用从非静态方法调用静态属性。那么,调试器坏了吗?因为我已经尝试了每一种组合,而且代码似乎只有在方法和属性都是静态或非静态的情况下才有效。 :(((

最佳答案

严格标准部分是因为 a::read() 是在静态上下文中使用 :: 调用的。在将 $a 声明为 A 的类实例之后,您应该使用 -> 对变量调用 read() 方法 运算符:

// Proper non-static method call
$a = new A();
$a->read();

在类定义中,$foo 被声明为私有(private)属性,但没有static 关键字。然后使用 :: 运算符而不是 -> 在静态上下文中引用它。访问它的正确方法是L

// Proper reference to non-static $foo
function read() {
echo $this->foo;
}

static 到底是什么意思?静态方法和属性是指所有当前和 future 的类实例共享的类方法和属性。如果 A::$foo 被声明为:

private static $foo;

那么您的代码中所有类 A 将只有一个 $foo。更改 $foo 会影响类 A 的所有实例,并且甚至无需创建该类的实例即可访问 $foo(如 >新A();)

同样,可以在不创建类实例的情况下调用静态方法,因为它们不会修改非静态的类属性。

// Static method call:
A::read();

要将属性和方法声明为static,只需添加static 关键字:

// Property
private static $foo;

// Method
public static function foo() {}

编辑更多示例:

class A
{
// Private property (non-static)
private $foo;

// Public property (static)
public static $bar = 12345;

// Public (non-static) function to access private $foo
public function getFoo() { return $this->foo; }

// Public (non-static) function to set private $foo
public function setFoo($newfoo) { $this->foo = $newfoo; }

// Static function
public static function incrementBar() { self::$bar++; }
}

现在看看它的实际效果:

// We haven't created any class instances yet (with the 'new' operator)
// But we can access the static properties & functions:

echo A::$bar . " ";
// prints 12345

A::incrementBar();
echo A::$bar . "\n";
// prints 12346

// Now we'll start working with class instances.
// Create 2 instances of class A
$a = new A();
$a->setFoo(8888);
$b = new A();
$b->setFoo(9999);

// It's a violation of strict standards to call getFoo() statically
// And it's meaningless to do so, because $foo only exists inside a class instance!

// Can't do this... Issues a strict warning since we're calling non-static getFoo() statically
//echo A::getFoo();


// But we can call getFoo() on the class instances:
echo $a->getFoo() . " " . $b->getFoo() . "\n";
// Prints 8888 9999

// Remember $bar was 12346...
echo $a::$bar . " " . $b::$bar . "\n";
// Prints 12346 12346

// Now modify the static property $bar again
// This affects all class instances.
A::incrementBar();
echo $a::$bar . " " . $b::$bar . "\n";
// Prints 12347 12347

我也把这整件事都塞进了键盘:http://codepad.viper-7.com/tV6omK

您正在阅读的书一定没有讲究严格的标准。如果非静态函数不尝试访问/修改非静态属性,您可以成功地静态调用它,但它会发出严格警告。如果非静态函数确实使用 $this->property 修改或访问非静态属性,这将是一个 fatal error 。你不能那样做。

在PHP的error_reporting中,show all errors的E_ALL设置实际上并不包含严格警告。这必须通过 E_ALL & E_STRICT 来完成。

关于PHP:为什么我会收到有关静态属性的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6337543/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com