Трейты и схожие функции

StalkerClasses

Новичок
Есть код

PHP:
<?php
// Laravel

trait A
{
    public function __get($name)
    {
        // Что-то делаем...
        return parent::__get($name);
    }
}

trait B
{
    public function __get($name)
    {
        // Что-то делаем...
        return parent::__get($name);
    }
}

class MyClass
{
    public function __get($name)
    {
        // Что-то делаем...
        // Как здесь запустить traitA и traitB?
        return parent::__get($name);
    }
}
?>
Как здесь запустить traitA и traitB внутри класса?
 

WMix

герр M:)ller
Партнер клуба
PHP:
class A{
  private $x = 42;
  public function __isset(string $name){
    return property_exists(static::class, $name);
  }
  public function __get(string $name){
    return $this->$name;
  }
}

class B{
  private $z=100500;
  public function __isset(string $name){
    return property_exists(static::class, $name);
  }
  public function __get(string $name){
    return $this->$name;
  }
}

class MyClass{
  private array $objs;
  public function __construct(array $objs){
    $this->objs = $objs;
  }
  public function __get(string $name){
    foreach($this->objs as $obj){
      if(isset($obj->$name)){
        return $obj->$name;
      }
    }
  }
}

$my = new MyClass([new A, new B]);
echo $my->x;
echo $my->z;
 

StalkerClasses

Новичок
PHP:
class A{
  private $x = 42;
  public function __isset(string $name){
    return property_exists(static::class, $name);
  }
  public function __get(string $name){
    return $this->$name;
  }
}

class B{
  private $z=100500;
  public function __isset(string $name){
    return property_exists(static::class, $name);
  }
  public function __get(string $name){
    return $this->$name;
  }
}

class MyClass{
  private array $objs;
  public function __construct(array $objs){
    $this->objs = $objs;
  }
  public function __get(string $name){
    foreach($this->objs as $obj){
      if(isset($obj->$name)){
        return $obj->$name;
      }
    }
  }
}

$my = new MyClass([new A, new B]);
echo $my->x;
echo $my->z;

Не совсем про это речь.

В интернете для Laravel есть такой трейт:

PHP:
trait HasDynamicRelation
{
    /**
     * Store the relations
     *
     * @var array
     */
    private static $dynamic_relations = [];

    /**
     * Add a new relation
     *
     * @param $name
     * @param $closure
     */
    public static function addDynamicRelation($name, $closure)
    {
        static::$dynamic_relations[$name] = $closure;
    }

    /**
     * Determine if a relation exists in dynamic relationships list
     *
     * @param $name
     *
     * @return bool
     */
    public static function hasDynamicRelation($name)
    {
        return array_key_exists($name, static::$dynamic_relations);
    }

    /**
     * If the key exists in relations then
     * return call to relation or else
     * return the call to the parent
     *
     * @param $name
     *
     * @return mixed
     */
    public function __get($name)
    {
        if (static::hasDynamicRelation($name)) {
            // check the cache first
            if ($this->relationLoaded($name)) {
                return $this->relations[$name];
            }

            // load the relationship
            return $this->getRelationshipFromMethod($name);
        }

        return parent::__get($name);
    }

    /**
     * If the method exists in relations then
     * return the relation or else
     * return the call to the parent
     *
     * @param $name
     * @param $arguments
     *
     * @return mixed
     */
    public function __call($name, $arguments)
    {
        if (static::hasDynamicRelation($name)) {
            return call_user_func(static::$dynamic_relations[$name], $this);
        }

        return parent::__call($name, $arguments);
    }
}






class MyModel extends Model {
    use HasDynamicRelation;
}





MyModel::addDynamicRelation('some_relation', function(MyModel $model) {
    return $model->hasMany(SomeRelatedModel::class);
});


Когда я его подключаю


class MyModel extends Model {
use HasDynamicRelation;
}

все замечательно работает, НО у меня есть другой трейт который также использует __get и __call и возникает конфликт.
Как использовать два и более трейтов в классе где присутствуют одинаковые названия функций?
 

WMix

герр M:)ller
Партнер клуба
В интернете для Laravel есть такой трейт:
некто i-rocky создал, хотел сказать
Как использовать два и более трейтов в классе где присутствуют одинаковые названия функций?
решить можно, но лучше избегать
 
Сверху