Разбор ООП с Delphinum

11.13K
.
Koenig,
class A
{
    protected $b;

    public function a()
    {
        return $this;
    }

    public function b()
    {
        retunr new B($this);
    }
}

class B
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function a()
    {
        return $this->a;
    }

    public function c()
    {
        return $this;
    }
}

(new A)->a()->b()->c()->a()->b()->c();
.
(\/)____o_O____(\/)
L!MP, ну почти то, в c() тоже вызов класса, и из него надо обратно в А вернуться
типо есть товарищ, зашёл в дом, наворотил там делов, вышел и пошёл в другой дом
.
Добавь b и c классам интерфейс вызова класса а.
Выглядит каким то извращением по моему
.
(\/)____o_O____(\/)
ramzes, не спорю, с доп методом это все легко реализуется. а без него? на магии?
.
class A {
    private $b;

    public function b() {
      $this->b = new B($this);
      return $this->b;
    }
}
     
class B {
    private $a;

    public function __construct(A $a){
      $this->a = $a;
    }

    public function test() {
      return $this;
    }

    public function a() {
      return $this->a;
    }
}
     
$obj = new A;
$obj->b()->test()->a()->...(...);
.
Delphinum, чем это отличается от того что я написал?
Ему там магия нужна, по человечески его не устраивает, гг
.
_call($classname) вот и вся его магия.
изврат извратов)
.
(\/)____o_O____(\/)
ramzes, __call($method, $args) семантика
.
(\/)____o_O____(\/)
Добавлено: 23.05.2017 / 21:06
L!MP, по человечески херня получается, сейчас покажу что не так, и почему хочется сделать без вызова стороннего метода
$builder
    ->where() // and
    ->add('id', '<', 400)
    ->add('fid', '>', 4550)
    ->add('pod', 'in', [1,2,3])
    ->add('pud', 'not between', [1,2])
    ->where('or')
    ->add('pid', '>=', 600)
    ->add('gid', '<=', 7850)
    ->order('id', 'asc')
    ->group('fid')
    ->limit(10, 5 ,'page')
    ->res();
$builder->placeholders();

у меня все уже написано кроме builder
то есть он основной класс, от него уже все пляшет, но отдельные части реализованы отдельными классами
select, update, delete, insert, where, group, limit, order, placeholders
основной класс будет типо конструктора, и хотелось бы все в одной цепочке сделать

Добавлено: 24.05.2017 / 01:22
вот такой велосипед у меня
<?php

trait Singleton {
    
    protected static $instance = null;
    
    public function __clone(){}

    public function __wakeup(){}

    public final static function getInstance() {
        if (null === static::$instance) {
            static::$instance = new static();
        }
        return static::$instance;
    }
}

class A 
{
    use Singleton;
    
    private $b;
    private $c;
    
    public function b(/* args for b*/) {
        $this->b = new B(/* args for b*/);
        return $this->b;
    }
    
    public function c() {
        $this->c = new C();
        return $this->c;
    }
    
    public function res() {
        echo '<pre>' . print_r($this, 1) . '</pre>';
    }
}

class B
{
    use Caller;
        
    public function add() {
        return $this;
    }
}

class C
{
    use Caller;
    
    public function add() {
        return $this;
    }
}

trait Caller {
    public function __call($method, $args) {
        if (!method_exists(__CLASS__, $method)) {
            return A::getInstance()->$method(...$args);
        }
    }
}

A::getInstance()->b()->add()->add()->c()->add()->add()->res();
.
Koenig, все пытаешься свой query builder запилить?
Всего: 713