Class

Vin-Diesel

Новичок
Про экцепшн наверное неверно выразился, просто первый раз с ним работаю)
Хорошо, если через globals нельзя, то возникает другой вопрос скажем, если я буду использовать Phemto, то как мне решить ту же задачу... Что-то я запутался.. можете привести пример с DI к первому посту????
 

tz-lom

Продвинутый новичок
а ты напиши сначала что ты стремишься сделать такой конструкцией
 

Vin-Diesel

Новичок
Да эт я придумал, для примера. Я только планирую, как сделать. Или может быть какой-то другой способ посоветуете?
А код примерно таков:
PHP:
class core {
function __construct() {
 $this->mysql = new mysqli('localhost','root','root','db');
}
function display() {
 $display = new Display();
 $display->mysql = &$this->mysql;
 return $display;
}
}
}
 

Sokil.Dmytro

Новичок
Раз уж так, то сеттер будет лучше публичного свойства. Это даст гарантию что в этом свойстве не сохранится что-либо другое.
 

Vin-Diesel

Новичок
Да вопрос в другом, можно ли как-то переложить сохранение ссылки на класс, с Core на Display
 

Sokil.Dmytro

Новичок
Да вопрос в другом, можно ли как-то переложить сохранение ссылки на класс, с Core на Display
сделать класс БД одиночкой, или у Core завести статический метод который будет инициализировать обьект БД и отдавать его, или вооще сделать ваш Core одиночкой, и тогда он станет одним большим реестром , и сможет быть получен любым обьектом вашего приложения, или сделать ваш Core по типу DI и передавать его куда надо
 

Vin-Diesel

Новичок
Что-то я понять не могу как у core завести статик метод который отдаст ссылку на класс бд? это же опять таки через глобалс реализуется?
 

HraKK

Мудак
Команда форума
Sokil.Dmytro
Статика зло, и одиночки в большинстве случаев тоже.
 

Sokil.Dmytro

Новичок
Sokil.Dmytro
Статика зло, и одиночки в большинстве случаев тоже.
я все сходу пришедшие в голову варианты перечислил, пусть выбирает :)

Что-то я понять не могу как у core завести статик метод который отдаст ссылку на класс бд? это же опять таки через глобалс реализуется?
В ZF абаптер по умолчанию получается как Zend_Db_Table_Abstract::getDefaultAdapter(); Как правильно тут заметили, не один из лучших вариантов, но все же вариант.

Вот и у вас может быть:
PHP:
class Core
{
    private static $_db;

    public static function getDB()
    {
        if(empty(self::$_db)) self::$_db = new DB();
        return self::$_db;
    }
}
и в любом месть получать его через Core::getDB();

Одним из недостатков этого метода есть то, что используется вхардкоживание Core, и если придется его менять - придется перелопачивать весь проект. С реестром и Core-одиночкой такой же недостаток. Так что Di как помне пооптимальней будет. В этом случае не будет связей между классами, а меньше сопряжение - меньше проблем с переписыванием
 

weregod

unserializer
Sokil.Dmytro
обходится как два пальца:

PHP:
class Core
{
    ...
    public static? function getResource($resId, $args)
    {
        ...
    }
}

/**
 * @var DB
 */
$db = Core::getReresource('db');
 

Sokil.Dmytro

Новичок
не совсем понял. А где будет происходить это присваивание? Нам же надо не только не передавать имя класса БД, но и обьект Core тоже
 

weregod

unserializer
Sokil.Dmytro, в вашем последнем коде никакой передачи объекта Core не было, в любом случае если Core::getResource() не делать статическим или внутри статических методов работать с инстанцией Core, то в массиве $args можно передать инстанцию.
 

Sokil.Dmytro

Новичок
Ступил. обозвал класс обьектом. Имеется ввиду то, что все равно во всех необходимых местах типа класса Display из вопроса автора придется писать Core::getResource(), или же опять же придумывать в таких классах сеттер
 
Сверху