Где можно почитать про операцию "::"

  • Автор темы Светлана PHP
  • Дата начала

Светлана PHP

Guest
Где можно почитать про операцию "::"

Вот пример из кода:
PHP:
$db =& db_factory :: instance();
Как это можно понять?
 

Светлана PHP

Guest
Практическое применение? Может кто-нибудь намекнёт?
 

Макс

Старожил PHPClub
самое простое применение (и возможно самое понятное для новичков) - имитация пространства имен (namespaces) в ПХП
 

Светлана PHP

Guest
В PHP отсутствует конструкция определения области видимости подобно namespace в C++.

Методы и переменные класса. Вот к этому делу обращаются с используя ::.

Пока вижу только одну причину делать так - это желание не загружать в память возможно лишнюю информацию экземпляра класса.
 

neko

tеam neko
это все тут непричем
в документации написано зачем и как
я честно говоря не вижу смысла в том, чтобы излагать это тут "своими словами"
 

Светлана PHP

Guest
Я увидела код на PHP4. Там используется конструкция
PHP:
$db =& db_factory :: instance();
Как Вы понимаете это не есть обращение к статической функции и константе. Зачем умные люди это сделали?
 

neko

tеam neko
видимо они получают таким образом ссылку на какой-то объект
объект очевидно возвращается статическим методом
 

Светлана PHP

Guest
neko, в PHP4 статических методов нет
PHP:
class        db_factory
{
  function &instance($db_type='', $db_params='', $force_new_instance=false)
  {
    if(!$db_type)
      $db_type = DB_TYPE;

    $db_class_name = 'db_' . $db_type;

    $obj        =& $GLOBALS['global_db_handler'];

    if (get_class($obj) != $db_class_name || $force_new_instance)
    {
      if(!$db_params)
      {
        $db_params['host'] = DB_HOST;
        $db_params['login'] = DB_LOGIN;
        $db_params['password'] = DB_PASSWORD;
        $db_params['name'] = DB_NAME;
      }

      include_once(LIMB_DIR . '/core/lib/db/' . $db_class_name . '.class.php');

      $obj =& new $db_class_name();

      $obj->connect_db($db_params);
      $obj->select_db($db_params['name']);

      $GLOBALS['global_db_handler'] =& $obj;
    }
    return $obj;
  }

...
 

neko

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

и к чему этот код?
 

Светлана PHP

Guest
Автор оригинала: neko
спасибо, я знаю что их нет
однако обычные методы можно вызывать как статические
т.е. без создания экземпляра
К тому что я и пришла к выводу, что люди попросту ресурсы берегут. Вы, как далеко не новичок, возможно знаете где тут истина? Зачем? Привычка что ль?
 

neko

tеam neko
тут очень много разного делается в этом коде

что касается конкрентно статического вызова, видимо кто-то хотел засунуть функцию в класс, по тем или иным причинам
скорее всего для того, о чем говорил выше Макс.

сберегание ресурсов тут не при чем, т.к. очевидно что этой функции никакие экземпляры ненужны...
 

Макс

Старожил PHPClub
Светлана PHP
вообще лучше этот вопрос задать авторам LIMB (у них есть свой форум + иногда заходят сюда). Они лучше объяснят.

В данном случае, наверное, это способ избавится от global-ов в функциях (или методах) и не передавать соединение с бд в параметре функции/метода
 

Светлана PHP

Guest
Вот уже конструктивно. Спасибо. Поняла
 

Vasya

Guest
Это реализация классического паттерна проектирования ООП, который называется "Фабрика Объектов" или просто "Фабрика". Это когда по тем или иным причинам нельзя допустить прямого создания объекта
PHP:
$db = & new ClassName();
за пределами "фабрики".
В этом конкретном примере разработчики хотят контролировать создание объектов соединения с БД. Это, imho, правильно, так как создание соединения с БД -- дорогостоящая операция.
 

Crazy

Developer
Vasya, вопрос не в factory. Вопрос в том, почему сделано так:

Код:
$db =& db_factory :: instance();
а не так, как делают всегда при реализации шаблона factory:

Код:
$db =& db_factory -> instance();
 

jonjonson

Guest
Method::Class();
Эта конструкция может быть полезна при наследовании:
PHP:
class Item
{
    var $mQuantity;
    var $mPrice;

    function Item($quantity = 0, $price = 0.00)
    {
        $this->mQuantity = $quantity;
        $this->mPrice = $price;
    }

    function TotalCost()
    {
        return $this->mPrice*$this->mQuantity;
    }
}

class PriceItem extends Item
{
    var $mId;
    var $mExtraCharge;
    function PriceItem ($id, $price=0.00, $quantity=0, $extraCharge = 0.00)
    {
        $this->mId = $id;
        $this->mExtraCharge = $extraCharge;
        $this->Item($quantity, $price);
    }

    function TotalCost()
    {
        return Item::TotalCost()+$this->mExtraCharge;
    }
}

$new_price_item = &new PriceItem(777, 99.99, 3, 0.50);
echo $new_price_item->TotalCost();
 

Alexandre

PHPПенсионер
Это реализация классического паттерна проектирования ООП, который называется "Фабрика Объектов" или просто "Фабрика".
Обычно такой паттерн используют, когда пишется несколько типов классов db (по одному на свою базу), а потом используя фабрику классов, инициализируют класс db, под свой тип БД (mysql, psgree,firebird и пр...)

Не знаю, как в случае с LIMB, но я использую именно так
http://phppatterns.com/
 

neko

tеam neko
обычно этот паттерн используют когда пишут на ограниченном в каком-то аспекте языке
однако это мало отношения имеет к тому коду, и вообще никакого к вопросу который был первоначально задан
 
Сверху