Я всегда вижу людей в серьезном использовании проектов:: везде, и-> только иногда в окружении.
Я только использую-> сам и никогда не заканчиваю в ситуациях, когда мне нужно статическое значение за пределами класса. Действительно ли я - плохой человек?
Поскольку я понимаю, единственная ситуация когда ->
не будет работать, когда я пробую следующее:
class StaticDemo {
private static $static
}
$staticDemo = new StaticDemo( );
$staticDemo->static; // wrong
$staticDemo::static; // right
Но я пропускаю некоторую правильность программирования, когда я не называю простые открытые методы ::
?
Или это именно так, что я могу назвать метод, не создавая экземпляр?
:: для ссылки на статические свойства или методы класса. -> для ссылки на свойства и методы экземпляра. Вы не упускаете из виду правильность программирования, и если вы плохой человек, то это не из-за этого. Какой из них вы используете, зависит от цели вашего класса и от того, как он написан. Но также в PHP до недавнего времени не было пространств имен, поэтому многие люди инкапсулировали свой код в статические классы для имитации пространств имен, чтобы избежать конфликтов имен. Возможно, вы видите код, который это делает.
Двойное двоеточие используется, когда вы не инстанцируете класс
class StaticDemo {...};
StaticDemo::static
Если вы инстанцируете, используйте -->
class StaticDemo {...};
$s = new StaticDemo();
$s->static;
Это объясняется далее на http://php.net/manual/en/language.oop5.patterns.php
Да, вы можете вызвать метод или получить доступ к значению без создания экземпляра.
Это было бы полезно, например, если у вас есть значение, которое используют все экземпляры класса. Допустим, это значение нужно инициализировать в начале работы приложения. Вы можете использовать что-то вроде StaticDemo::static = 42;
для его инициализации, и тогда все экземпляры вашего класса смогут получить к нему доступ.
Как говорили другие,
::
«двойное двоеточие» используется для ссылки на статическое свойство или метод. ->
«Стрелка-тире» предназначена для ссылки на свойство или метод экземпляра класса. Но также стоит отметить, что
::
часто используется в текстах как сокращение для обозначения свойства или метода, принадлежащего определенному классу (будь то статический или экземплярный). См. "Примечание ... в документации ...": http://books.google.co.uk/books?id=qVLjFk_4zVYC&lpg=PA66&dq=php%205%20objects&pg=PA46#v= onepage & q = php% 205% 20objects & f = false
Что ж, вы правы насчет использования -> и ::. Но иногда просто бессмысленно создавать объекты класса. Вот пример Сравните
class Settings
{
public static $setting1;
public static $setting2;
... // lots of other vars and functions
}
if(Setting::$setting1)
//do something
с
class Settings
{
public $setting1;
public $setting2;
... // lots of other vars and functions
}
$set = new Settings()
if($set->setting1)
//do something
Как я уже сказал, не имеет смысла создавать экземпляры, поскольку всегда есть только один необходимый. в этом случае лучше подходит статика. Оказывается, в сети мы в основном имеем дело с подобными случаями, если только вы не имеете дело с реальными объектами , например. пользователи и т. д., следовательно, преобладают первые
-> для созданного класса. :: - статический вызов.
:: используется в конструкторах наследования (дочерний элемент, обращающийся к родительскому конструктору) и при ссылке на статический метод внутри другого метода.
Я бы не сказал, что отказ от статических вызовов также делает вас плохим человеком!
Как я понимаю, статика разделяется между объектами одного типа:
class test{
static function print_test(){
print "hello!";
}
}
$objectA = new test();
$objectB = new test();
Функция print_test будет "разделяться" между двумя объектами. Но загвоздка в том, что функция print_test() не должна ссылаться на что-либо внутри класса! даже если PHP 5 это допускает.
Поскольку функция print_test в примере просто печатает "hello!" и не ссылается ни на что внутри класса, зачем выделять для нее память в $objectA и $objectB? Просто сделайте одну статическую функцию, и $objectA и $objectB будут ссылаться на нее автоматически.
Ну, такова теория в других языках, но поскольку php5 позволяет вам ссылаться на $this в статической функции, я не верю, что это действительно статическая функция, поскольку она должна быть динамической, чтобы получить любые свойства для ($this->variable) этого уникального объекта.
:: используется для статических методов, которые вы вызываете, если у вас нет экземпляра объекта.
Используйте "->" в контексте объекта и "::" при прямом обращении к классу. В вашем примере это будет:
class StaticDemo {
public static $staticVar = 'blabla';
public $normalVar = 'foobar';
}
$foo = new StaticDemo();
echo $foo->normalVar; //object context, echoes "foobar"
echo StaticDemo::staticVar; //class or "static" context, echoes "blabla"
Читайте здесь для подробной информации.
Или это просто для того, чтобы я мог вызвать метод без создания экземпляра?
Верно.
Операторы :: (операторы разрешения области видимости) используются при вызове статических методов/членов. Для этого не нужно создавать экземпляр (как это было в вашем примере).
Использование -> и :: в правильном контексте является ключом к корректности объектно-ориентированного программирования. Вы должны создавать статические переменные/методы только тогда, когда они применяются к классу в целом, а не только к конкретному экземпляру (объекту) класса.
Статические методы и свойства не зависят от конкретного экземпляра класса. Доступ к ним должен осуществляться с использованием двойного двоеточия (: :). Доступ к нестатическим методам и свойствам следует осуществлять с помощью ->
. Это позволяет делать довольно интересные вещи. Тривиальный пример - счетчик, который отслеживает количество существующих экземпляров класса:
class foo {
public static $i = 0;
public function __construct() {
self::$i++;
}
}
$a = new foo();
$b = new foo();
echo foo::$i;
// outputs 2
Вы вызвали предупреждение о строгих стандартах в режиме E_STRICT. Вы плохой человек.
<?php
error_reporting(E_ALL | E_STRICT);
header('Content-type: text/plain');
class Foo {
public $msg = "Hello, public.\n";
public static $msgStatic = "Hello, static.\n";
public function write() {
echo "Hello, write.\n";
}
public static function writeStatic() {
echo "Hello, writeStatic.\n";
}
}
//echo Foo::$msg; // Fatal error: Access to undeclared static property: Foo::$msg
echo Foo::$msgStatic;
echo Foo::write(); // Strict Standards: Non-static method Foo::write() should not be called statically
echo Foo::writeStatic();
echo "------------------------\n";
$f = new Foo;
echo $f->msg;
echo $f->msgStatic; // Strict Standards: Accessing static property Foo::$msgStatic as non static
// Notice: Undefined property: Foo::$msgStatic
echo $f->write();
echo $f->writeStatic();
Выход:
Hello, static.
Strict Standards: Non-static method Foo::write() should not be called statically in /home/adam/public_html/2010/05/10/bad.php on line 22
Hello, write.
Hello, writeStatic.
------------------------
Hello, public.
Strict Standards: Accessing static property Foo::$msgStatic as non static in /home/adam/public_html/2010/05/10/bad.php on line 29
Notice: Undefined property: Foo::$msgStatic in /home/adam/public_html/2010/05/10/bad.php on line 29
Hello, write.
Hello, writeStatic.