Как вызывать функции в классе, подобном Symfony QueryBuilder

#php

#php

Вопрос:

Я пытаюсь создать класс PHP, и когда я вызываю его функции, я хочу, чтобы они вызывались таким образом.

 $result = $instance->init()->selectAll('user')->where('id = 1');
$result->execute();
 

пример класса:

 class user{
    public static $name = "test";
    public $email;
    public $last_name;
    public $first_name;
    public $changed_name;
    
    public function getName(){
        return static::$name;
    }
    
    public function init(){
        static::$name = "John";
    }
}
 

Теперь я хочу назвать это так:

 echo $user->init()->getName();
 

Я видел это в PDO и в Symfony QueryBuilder. Если есть способ сделать это, пожалуйста, скажите мне. Заранее спасибо.

Комментарии:

1. Свободный интерфейс

Ответ №1:

Чтобы добиться цепочки методов, вы должны вернуть $this вместо возврата static::$name; как в функции getName(). Вам также следует подумать о том, чтобы сделать свойства вашего класса закрытыми или защищенными на случай, если вы используете наследование, чтобы избежать изменений извне

 class Sql
{
private string $table='';
private array  $select      = [];
private string $queryString = '';

public function table(string $table): Sql
{
    $this->table = $table;
    return $this;
}

public function select(array $select): Sql
{
    $this->select = $select;
    return $this;
}

public function getQueryString(): string
{
    return $this->queryString;
}

public function setQueryString(string $queryString): void
{
    $this->queryString = $queryString;
}

private function buildSelect(array $col=[]): void
{
    if(count($this->select)==0)
    {
        $command = "*";
    } else {
        $command = implode(separator:',',array:$this->select);
    }

    $command = "SELECT ".$command." FROM ".$this->table;
    $this->setQueryString($command);
}

public function get(): string
{
    $this->buildSelect();
    return $this->getQueryString();
    }

}

$sql = new Sql();
$s = $sql->table('users')->select(['name','age'])->get();
echo "<pre>";
print_r($s);
echo "</pre>";
 

Вы получите вывод в виде: ВЫБЕРИТЕ имя, возраст ИЗ списка пользователей

Комментарии:

1. Спасибо за помощь, у меня были свои подозрения на этот счет. Еще раз спасибо.

2. Я обновляю ответ. Вот пример, который я построил для вас

3. Большое вам спасибо, я ценю ваши усилия.