2010-05-10 1 views
14

Я всегда вижу, что люди в серьезных проектах используют :: везде, и -> только изредка в локальной среде.Разница между :: и -> в PHP

Я использую только сам себя и никогда не попадаю в ситуации, когда мне нужно статическое значение вне класса. Я плохой человек?

Как я понимаю, единственная ситуация, когда -> не будет работать, когда я пытаюсь следующее:

class StaticDemo { 
    private static $static 
} 

$staticDemo = new StaticDemo(); 

$staticDemo->static; // wrong 
$staticDemo::static; // right 

Но мне не хватает на какой-программирования корректности, когда я не называю простые общественные методы, с помощью :: ?

Или это просто так, что я могу вызвать метод без создания экземпляра?

+14

«Я плохой человек?» LOL –

+2

Вы плохой человек, потому что вы создали случайный класс, чтобы просто вызвать его статическое поле. – doc

+0

Возможный дубликат [Разница между «->» и «::» в PHP MySQLi OOP] (http://stackoverflow.com/questions/1245121/difference-between-and-in-php-mysqli-oop) – Sarfraz

ответ

7

:: предназначен для ссылок на статические свойства или методы класса. -> для ссылки на свойства и методы экземпляра. Вы не упускаете какую-либо правильность программирования, и если вы плохой человек, то это не из-за этого. Какой из них вы используете, зависит от цели вашего класса и того, как он написан. Но также, у PHP не было пространств имен до недавнего времени, так много людей инкапсулировали свой код в статические классы для эмуляции пространств имен, чтобы избежать коллизий имен. Возможно, вы видите код, который делает это.

12

Двойное двоеточие используется, когда вы не создаете экземпляр класса

class StaticDemo {...}; 
StaticDemo::static 

если экземпляр, использование ->

class StaticDemo {...}; 
$s = new StaticDemo(); 
$s->static; 

Это объясняется далее в http://php.net/manual/en/language.oop5.patterns.php

+13

Вы все еще не ответили, плохой он или нет. Я лично считаю, что это основной вопрос. Вы просто ответили на второстепенные вопросы. : P –

+3

Не плохой человек, по крайней мере, не так плохо, как человек, который проголосовал за меня без объяснения причин. Как я могу улучшить? –

2

Да, вы можете вызвать метод или получить доступ к значению без создания экземпляра.

Было бы полезно, например, если у вас есть значение, которое используют все экземпляры класса. Скажем, это значение, однако, должно быть инициализировано в начале вашего приложения. Вы можете использовать что-то вроде StaticDemo::static = 42; для его инициализации, а затем все экземпляры вашего класса смогут получить к нему доступ.

1

:: используется для статических методов, которые вы вызываете, если у вас нет экземпляра объекта.

3

-> предназначено для некоммерческого класса. :: является статическим вызовом.

:: используется в конструкторах наследования (дочерний элемент, обращающийся к родительскому конструктору) и при обращении к статическому методу внутри другого метода.

Я бы не сказал, что не используя статические вызовы, вы тоже плохой человек!

1

Статические методы и свойства не зависят от конкретного экземпляра класса. К ним следует обращаться с использованием двойных двоеточий (: :). Нестатичные методы и свойства должны быть доступны с использованием ->

Это позволяет вам делать довольно интересные вещи. Простейший пример является счетчиком, который отслеживает количество экземпляров класса существует:

class foo { 
    public static $i = 0; 

    public function __construct() { 
    self::$i++; 
    } 
} 

$a = new foo(); 
$b = new foo(); 
echo foo::$i; 
// outputs 2 
1

Использование «->», когда в контексте объекта и «::» при обращении к классу непосредственно. В вашем примере это будет:

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" 

Read this для детальных разведданных.

1

Или это просто так, что я могу вызвать метод без создания экземпляра?

Исправить.

Операторы :: (операторы разрешения области) используются при вызове статических методов/членов. Вам не нужно создавать экземпляр для этого (как в вашем примере).

Использование -> и :: в правильном контексте является ключом к объектно-ориентированной правильности программирования. Вы должны создавать только статические переменные/методы, когда они применяются к классу в целом, а не только к определенному экземпляру (объекту) класса.

0

Ну, вы правы в использовании -> и ::. Но иногда это просто не делает ничего смысл для создания объектов класса. Вот пример Сравнить

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 

Как я сказал, это не имеет смысл создавать экземпляры, как всегда есть требуется только один. в этом случае статические подходят лучше. Оказывается, в сети мы в основном занимаемся таким случаем, если вы не имеете дело с реальными Объектами например. пользователей и т. д., следовательно, распространенность прежних

4

Вы вызвали строгую предупреждение о стандартах в режиме 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. 
1

Как уже говорили другие,

  • :: 'двойное двоеточие' для ссылки на статический метод или свойство.
  • -> 'dash arrow' предназначен для ссылки на свойство или метод экземпляра класса.

Но и его стоит отметить, что

  • :: часто используется в текстах, обозначающим обратиться к свойству или методу, который принадлежит к определенному классу (будь то статический или экземпляр).

См. «Примечание ... в документации ...': 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

2

Как я понимаю статический поделена между объектами одного и того же типа:

class test{ 
    static function print_test(){ 
     print "hello!"; 
    } 
} 
$objectA = new test(); 
$objectB = new test(); 

Функция print_test будет „общий“ между этими двумя объектами. Но уловкой является функция print_test() не должно ссылаться на что-нибудь внутри класса! даже ваш PHP 5 принимает его.

Поскольку функция print_test в примере просто распечатывает «привет!». и не ссылается ни на что внутри класса, зачем выделять для него память в $ objectA и $ objectB? Просто сделайте одну статической функцией, а $ objectA и $ objectB должны указывать на нее автоматически.

Ну, это теория, лежащая в ее основе на других языках, но поскольку php5 позволяет ссылаться на $ this в статической функции, я не верю в ее истинную статическую функцию, поскольку она должна быть динамической, чтобы получить какие-либо свойства для ($ this-> переменная) этот уникальный объект.

Смежные вопросы