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

Пропал наследник: Начало

  • RedRabbit

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

    Spritz Сен. 9, 2015, 8:15 п.п.

    Привет пыха!

    есть класс:

    class User extends Database {
    
        public static $table = 'users';
    
    }
    

    Теперь сам класс Database

    class Database {
    
        protected static $instance = null;
    
        protected static function run() {
            if(!is_object(self::$instance)) {
                self::$instance = new DB;
                self::$instance->table = self::$table;
            }
        }
    
    }
    

    Как сделать чтобы переменная self::$table из User была вида в главном Database ?

  • phpdude

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

    Spritz Сен. 9, 2015, 8:59 п.п., спустя 43 минуты 58 секунд

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

    Сапожник без сапог
  • NRG

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

    Spritz Сен. 9, 2015, 9:18 п.п., спустя 18 минут 23 секунды

    фи, статические методы

  • phpdude

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

    Spritz Сен. 9, 2015, 10:04 п.п., спустя 46 минут 21 секунду

    там еще вроде как была фишка, что даже если как алексб сказал сделать, то не сработает )) нужно через статик:: обращаться. англ клавы нет :)

    Сапожник без сапог
  • AlexB

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

    Spritz Сен. 9, 2015, 10:07 п.п., спустя 2 минуты 43 секунды

    блин, вместо редактировать, нажал удалить ))) в общем я сказал, что сама идея, чтобы класс зависел от наследника идиотская, надо наоборот. ))))

  • RedRabbit

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

    Spritz Сен. 9, 2015, 11:58 п.п., спустя 1 час 51 минуту 42 секунды

    Я хочу реализовать идею как в Laravel. У них есть класс Eloquent и его все наследуют. Каждая модель (User, Articles) указывает свою базу.
    http://laravel.com/docs/4.2/eloquent#basic-usage](http://laravel.com/docs/4.2/eloquent#basic-usage)

    <?php
    class User extends Eloquent {
    
        protected $table = 'my_users';
    
        public static function name() {
            return self::where('id', '=', 1)->first();
        }
    
    }
    

    фи, статические методы

    @NRG, мне нравится конструкция
    User::where('id', '>', '10')->orderBy('age')->get();

    Не хотел ебаться с new для каждой модели. Как по мне, статические классы удобнее в вопросе доступа к ним.

    Спустя 205 сек.

    Ссылка вышла битой...
    Пример Laravel Docs

    Спустя 212 сек.

    Сам Database

    <?php
    
    class Database {
    
        protected static $instance = null;
    
        protected static function run() {
            if(!is_object(self::$instance)) {
                self::$instance = new DB;
            }
        }
    
        public static function where($row, $symbol, $value) {
            self::run();
            return self::$instance->where($row, $symbol, $value);
        }
    
        public static function table($name) {
            self::run();
            return self::$instance->table($name);
        }
    
        public static function orWhere($row, $symbol, $value) {
            self::run();
            return self::$instance->orWhere($row, $symbol, $value);
        }
    
        public static function orderBy($col_name, $value) {
            self::run();
            return self::$instance->orderBy($col_name, $value);
        }
    
        public static function limit($offset, $rows=null) {
            self::run();
            return self::$instance->limit($offset, $rows=null);
        }
    
        public static function col($col) {
            self::run();
            return self::$instance->col($col);
        }
    
    }
    

    По сути я могу использовать класс так:
    User::table('users')->where('id', '=', 1)->get();

    Но вот этот table('users') не дает мне покоя, хочется запихнуть его в переменную которую увидит Database.

  • RedRabbit

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

    Spritz Сен. 10, 2015, 12:45 д.п., спустя 46 минут 46 секунд

    Проблема решена.

    Создаем в Database метод table_name(), который при наследовании получит данные из константы static::table которая видна исключительно в User.
    <?php

    public static function table_name() {
        return static::table;
    }
    

    Потом в самом Database:
    <?php

    class Database {
    
        protected static $instance = null;
    
        protected static function run() {
    
            if(!is_object(self::$instance)) {
                self::$instance = new DB;
                self::$instance->table = forward_static_call(
                        array( get_called_class() , &#39;table_name&#39;)
                );
            }
        }
    

    Все разрулила функция forward_static_call(). Ну и get_called_class() чтобы узнать имя класса который унаследовал Database.

    Спустя 213 сек.

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

    @phpdude, а вот и получилось.

  • phpdude

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

    Spritz Сен. 10, 2015, 9:27 д.п., спустя 8 часов 41 минуту 44 секунды

    @phpdude, а вот и получилось.

    @RedRabbit, если бы я тебе не сказал про статик, то хуй бы чо получилось, признайся ;) умничать не над, я все равно умнее

    Спустя 69 сек.

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

    Сапожник без сапог
  • NRG

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

    Spritz Сен. 10, 2015, 11:40 д.п., спустя 2 часа 13 минут 13 секунд

    User::where(&#39;id&#39;, &#39;>&#39;, &#39;10&#39;)->orderBy(&#39;age&#39;)->get();
    

    я за такой код готов убивать :)
    статические зависимости, не тестабельно. фи.

    я неистово ненавижу код, который с претензией на ООП, но с кусками говна из ПП и ФП.

    а чтоб не ебаться с new, используй DI/

  • adw0rd

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

    Spritz Сен. 10, 2015, 12:27 п.п., спустя 46 минут 38 секунд

    @NRG, где тут ФП или ты не про этот случай?

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • RedRabbit

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

    Spritz Сен. 10, 2015, 1:03 п.п., спустя 36 минут 17 секунд

    а чтоб не ебаться с new, используй DI/

    @NRG, можно подробнее?
    Гугл кинул меня на Dependency Injection, это имел в веду?

  • adw0rd

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

    Spritz Сен. 10, 2015, 1:08 п.п., спустя 4 минуты 29 секунд

    @RedRabbit, да

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • NRG

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

    Spritz Сен. 10, 2015, 1:37 п.п., спустя 29 минут 42 секунды

    @adw0rd, я не конкретно про этот случай.
    @RedRabbit, да, под DI я имел ввиду Dependency Inversion принцип. поинтересуйся еще про SOLID.
    но это только в том случае если тебе интересно OOP и OOD, если тебе надо просто чтоб работало то пиздячь как умеешь :)

  • vasa_c

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

    Spritz Сен. 10, 2015, 2:51 п.п., спустя 1 час 13 минут 59 секунд

    Всей херни не читал, но очевидно нужно просто определить $table в базовом классе, а потом переопределять в наследниках.

    Спустя 52 сек.

    Ну и static скорее всего вместо self использовать

  • RedRabbit

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

    Spritz Сен. 10, 2015, 3 п.п., спустя 8 минут 55 секунд

    определить $table в базовом классе, а потом переопределять в наследниках

    @vasa_c, делал. Не работало.

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