I’m trying to create a PHP class and when I call its functions I want them to be called this way.
JavaScript
x
$result = $instance->init()->selectAll('user')->where('id = 1');
$result->execute();
class example:
JavaScript
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";
}
}
Now I want to call it this way:
JavaScript
echo $user->init()->getName();
I’ve seen this in PDO and in Symfony QueryBuilder. If there’s a way to do this please tell me. Thanks in advance.
Advertisement
Answer
In order to achieve method chaining you should return $this instead of returning static::$name; as in function getName(). You should also consider making your class properties private or protected in case you use inheritance to avoid modification from outside
JavaScript
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>";
You will get the output as: SELECT name,age FROM users