ФорумПрограммированиеPHP для идиотовPHP и ООП → построение классов

построение классов

  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 14 августа 2008 г. 11:53

    я хотел сначала тиснуть тему в "для профи" но потом подумал что сюда она лучше подходит


    class MyClass{
    public $db;
    public function __constructor($db){
    $this->db = $db;
    }
    public myFunc(){
    return $this->db->Execute();
    }
    }



    class MyClass{
    public function __constructor(){
    }
    public myFunc(){
    $db = ConnectionFactory::getDBInstance();
    return $db->Execute();
    }
    }


    что лучше? тоесть как вы относитесь к тому что один обьект может быть свойством второго
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 14 августа 2008 г. 12:02, спустя 8 минут 16 секунд

    Если объект может иметь свойства различных типов, то почему ими не могут быть объекты? :)

    Первый способ более расширяемый - можно передавать объектам MyClass различные объекты разных баз + MyClass ничего не должен знать о ConnectionFactory.
  • killich

    Сообщения: 270 Репутация: N Группа: Адекваты

    Spritz 14 августа 2008 г. 12:35, спустя 33 минуты 22 секунды

    как вы относитесь к тому что один обьект может быть свойством второго

    таки позвольте узнать, а как вы относитесь к тому, что объект Печень является
    свойством объекта Человек? Я лично очень положительно отношусь.



    class Программист_Бухарик{
    public $печень;

    public function __родиться_на свет($печень){
    $this->печень = $печень;
    }
    public Работа_Печени(){
    return $this->печень->Работай_Нах();
    }
    }




    А вто второй пример вызывает следующую ассоциацию:
    Пошел я пиво пить, а тут оказалось что печени у меня нет и пришлось использовать печень Иванова.


    class Программист_Бухарик{
    public function __родиться_на свет(){
    }
    public нейтрализовать_алкоголь(){
    $продукт = Иванов_Печень::Нейтрализовать_Алкоголь();
    return $продукт->Вывести_из_организма();
    }
    }



    Пофлудим ? :D
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 14 августа 2008 г. 13:03, спустя 27 минут 46 секунд

    тоесть как вы относитесь к тому что один обьект может быть свойством второго

    Хуле нет? :)

    class something
    {
    private $db;

    public function __construct()
    {
    global $db;
    $this->db = &$db;
    }

    public function select_something()
    {
    return $this->db->sql_query ('SELECT * FROM `something`');
    }
    }
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 14 августа 2008 г. 13:44, спустя 41 минуту 25 секунд

    тоесть как вы относитесь к тому что один обьект может быть свойством второго
    делегирование - одна из основ всего ООП, какое тут может быть отношение? :)

    Первый способ более расширяемый - можно передавать объектам MyClass различные объекты разных баз

    т.е. смысл есть только при изпользовании одновременно нескольких БД?

    MyClass ничего не должен знать о ConnectionFactory.

    сцепление - это конечно плохо, но тогда придется постоянно таскать с собой ссылку на объект БД

    Имхо, второй способ может быть менее правильный, но более простой - [tt]ConnectionFactory::getDBInstance()[/tt], как единая точка получения ссылки на БД. Ну у меня просто так обычно - где-то в начале делается коннект с базой ([tt]$hdb = new goDB(…); goDB::setDB($hdb, DBConfig::BASE);[/tt]), а потом, везде где мне нужно получить доступ к БД - [tt]$db = goDB::getDB(DBConfig::BASE);[/tt]

    sap, вай-вай-вай… ну шо эта за кансрукция? =)
    $this->db = &$db;

    у нас php5, там объекты и так по ссылке передаются.
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 14 августа 2008 г. 14:22, спустя 37 минут 38 секунд

    т.е. смысл есть только при изпользовании одновременно нескольких БД?

    Смысл в том, что получил при создании базу с которой работать и ниипёт. Ни сколько их, ни откуда их брать.
  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 14 августа 2008 г. 14:41, спустя 18 минут 58 секунд

    одназначно первый! читаем про инверсию зависимостей!
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 14 августа 2008 г. 14:45, спустя 3 минуты 54 секунды

    killich, нет не пофлудим

    sap, ты меня разочаровал global $db; редкасная хрень

    Timur, Про одну дб поддерживаю но не очень актулаьно потому что ConnectionFactory в данном случае выступает в роли СервисЛокатора который знает какое подключение ему вернуть, он его не создает каждый раз а только возвращает ссылку возможно даже на синглтон

    и еще по поводу твоего замечания сапу, вот тут класс с примерами работы
    http://mabp.kiev.ua/content/2008/04/17/registry/
    выполни его а потом убери все амперсанды и выполни еще раз и посмотри результат

    Patrick, читали, ты же не хочешь сказать что я должен засетить базу в обьект чтобы база выполнила над ним действие?
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 14 августа 2008 г. 15:27, спустя 42 минуты 25 секунд

    CTAPbIu_MABP, ану-ка расскажи, чем тебе не нравится global
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 14 августа 2008 г. 15:34, спустя 6 минут 42 секунды

    sap, как по мне он вабще пацавато выглядит
    а в класе он просто нарушает инкапсуляцию
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 14 августа 2008 г. 17:40, спустя 2 часа 5 минут 58 секунд

    а в класе он просто нарушает инкапсуляцию

    Каким образом? Все равно $db — свойство обьекта.
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 14 августа 2008 г. 18:17, спустя 37 минут 20 секунд



    class something
    {
       private $db;
       
       public function __construct()
       {
           global $db;
           $this->db = &$db;
       }
       
       public function select_something()
       {
           return $this->db->sql_query ('SELECT * FROM `something`');
       }
    }

    $db = new DB(/**/); // типа был у нас объект
    $x = new something(); // создает твой суперкласс
    $db = null; // сетим нал в дб
    $x->select_something(); // получаем ошибку о том что вызываеться метод вне контекств объекта



    при том что у тебя по ссылке null попадет внутрь класса
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 14 августа 2008 г. 18:18, спустя 1 минуту 9 секунд

    А если передать аргументом, то такого не будет?
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 14 августа 2008 г. 18:40, спустя 21 минуту 25 секунд

    выполни его а потом убери все амперсанды и выполни еще раз и посмотри результат

    стоп, у тебя там везде возврат по ссылке из методов, а в той строке было простое копирование.

    А если передать аргументом, то такого не будет?

    Мануал: контроль типа
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 14 августа 2008 г. 19:49, спустя 1 час 9 минут 39 секунд

    А, ну да, разве что.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!