разница между :: и ->

EugeneS

Новичок
разница между :: и ->

собственно сабж ...
перехожу с 4 на 5 и вот чётко понять не могу в каких случаях использовать :: а не -> почему именно :: и в чём между ними разница ...

на мануал не отсылайте ток ... уже не раз прочёл прежде чем задать вопрос ... там факты а не объяснение ....
 

svetasmirnova

маленький монстрик
:: для статических свойств и методов
-> для динамических свойств и методов
 

EugeneS

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

svetasmirnova

маленький монстрик
Да, просто что бы обращаться без объявления класса.
Вопрос "в чём приемущество" неверный, так как данная возможность обеспечивает гибкость. То есть существуют ситуации, в которых преимущество даёт использование статического метода или свойства; в других динамического. Советую почитать книжки по ООП.
В общем случае статические свойства нужны для сохранения какого-то значения, одинакового для всех объектов класса.
Применение статических методов, например, позволяет присвоить значение статическому свойству до объявления класса. Или ещё пример: как создать экземпляр класса, у которого private конструктор?
 

kruglov

Новичок
В языках Java и Javascript есть, например, абстрактный класс Math, в котором есть статические компоненты типа Math.sin() и Math.PI.

Т. е. математика у нас хранится отдельно от всего остального. Остальное тоже отдельно хранится...
 

specialist

Guest
Автор оригинала: svetasmirnova
Или ещё пример: как создать экземпляр класса, у которого private конструктор?
поясни пожста, зачем (и/или где) это ( private конструктор) применяется..ещё лучше приведи маленький пример..заранее благодарен
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: specialist
поясни пожста, зачем (и/или где) это ( private конструктор) применяется..ещё лучше приведи маленький пример..заранее благодарен
PHP:
class Foo
{
    private function __construct()
    {
    }


    public static function singleton()
    {
        static $instance;

        if (empty($instance)) {
            $instance = new Foo();
        }
        return $instance;
    }
}

$foo = Foo::singleton();
edit: фигурную скобку проэтосамое
 

demongloom

Новичок
Помоему private construct не поможет, ведь обьект создастся вне зависимости от результата __construct или существования. Вот если бы можно было бы уничтожать обьект или прерывать процесс создания обьекта из метода обьекта, к примеру unset($this), то это было бы намного проще.
 

Profic

just Profic (PHP5 BetaTeam)
прерывать процесс создания обьекта из метода обьекта
Это как (в смысле создание объекта из метода)? Объект "создается" конструктором. (Он конечно может вызывать другие методы и ф-ции, но это сути не меняет). А создание и так легко и непренужденно прерывается:
PHP:
throw new Exception();
 

demongloom

Новичок
Я имел ввиду прервать процесс создания обьекта в методе, то бишь тот же самый exception.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: demongloom
Помоему private construct не поможет, ...
А давай-ка ты, дружок, перестанешь надувать щёки и запустишь мой пример, дополнив его строчкой
PHP:
$foo2 = new Foo();
и доложишь в эту тему о результатах.

Если не доложишь, будем считать что слил.
 

demongloom

Новичок
Автор оригинала: Sad Spirit
А давай-ка ты, дружок, перестанешь надувать щёки и запустишь мой пример, дополнив его строчкой
PHP:
$foo2 = new Foo();
и доложишь в эту тему о результатах.

Если не доложишь, будем считать что слил.
Результат хороший, но только фатальный еррор не есть хорошо. Уж лучше warning через throw exception делать.
 

specialist

Guest
Sad Spirit
спасибо за пример...и ещё тогда уж поясни область применения...другими словами, когда такое может понадобиться?
 
Сверху