Часть строгих стандартов связана с тем, что a::read()
вызывается в статическом контексте с ::
. После объявления $a
в качестве экземпляра класса A
необходимо вызвать метод read()
для переменной с помощью оператора ->
:
// Proper non-static method call
$a = new A();
$a->read();
В определении класса $foo
объявлено как частное свойство, но без ключевого слова static
. Затем в статическом контексте на него ссылаются с помощью оператора ::
вместо ->
. Правильный способ доступа к нему будет L
// Proper reference to non-static $foo
function read() {
echo $this->foo;
}
Теперь, что значит static
? Статические методы и свойства относятся к методам и свойствам класса, которые являются общими для всех текущих и будущих экземпляров класса. Если A::$foo
было объявлено как:
private static $foo;
тогда в вашем коде будет только один $foo
для всего класса A
. Изменение $foo
повлияет на все экземпляры класса A
, и к $foo
можно получить доступ даже без создания экземпляра класса (например, new 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
, это будет фатальной ошибкой. Вы не можете этого сделать.
В PHP error_reporting
установка E_ALL
для показа всех ошибок на самом деле не содержит строгих предупреждений. Это должно быть сделано с E_ALL & E_STRICT
.