@Kostik_1993
Fullstack Web Developer | PHP | Laravel | Vue.js

Как автоматически вызвать функцию в PHP?

Можно ли вызвать свою функцию в конце работы объекта? По аналогии с деструктором?

вот сам код класса
class DB
{

	private $bValue;
	
	private $db;
	private $db_host = "localhost";
	private $db_name = "";
	private $db_user = "";
	private $db_pass = "";

    public function __construct(){
        $this->str = "";
		$this->connectDb($this->db_name, $this->db_user, $this->db_pass, $this->db_host);
    }
	
	public function __destruct(){
		$this->db = null;
    }

	public function sql($sql){
        $this->str .= $sql;
        return $this;
    }
	
    public function select($select){
        $this->str .= 'SELECT SQL_CALC_FOUND_ROWS '.$select;
        return $this;
    }
	
	public function from($from){
        $this->str .= ' FROM '.$from;
        return $this;
    }

	public function where($where){
        $this->str .= ' WHERE '.$where;
        return $this;
    }
	
	public function andwhere($andwhere){
        $this->str .= ' AND '.$andwhere;
        return $this;
    }
	
	public function orderBy($orderby){
		$this->str .= ' ORDER BY '.$orderby;
        return $this;
	}
	
    public function limit($limit){
        $this->str .= ' LIMIT '.$limit;
		return $this;
    }
	
	public function paginate($per_page){
		$this->per_page = $per_page;
		$this->cur_page = isset($_REQUEST['page']) ? ((int) $_REQUEST['page']) : 1;
		$this->start = (int)(($this->cur_page - 1) * $this->per_page);
		$this->str .= ' LIMIT :start, :per_page';
		$this->bValue[] = array(':per_page', $this->per_page, PDO::PARAM_INT);
		$this->bValue[] = array(':start', $this->start, PDO::PARAM_INT);
		return $this;
    }
	
	public function bindValue($value1, $value2, $value3){
		$this->bValue[] = array($value1, $value2, $value3);
		return $this;
	}
	
	public function start(){
		
		$sth = $this->db->prepare($this->str);
		
		if($this->bValue)
		{
			
			foreach($this->bValue as $k)
			{
				
				$sth->bindValue($k[0], $k[1], $k[2]);
				
			}
			
		}
		
		$sth->execute();
		
		$this->rows = $this->db->query("SELECT FOUND_ROWS()")->fetchColumn(0);
		
		return $this->result = $sth;
		
	}

	public function connectdb($db_name, $db_user, $db_pass, $db_host = "localhost"){
		try {
			$this->db = new \pdo("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
		} catch (\pdoexception $e) {
			echo "database error: " . $e->getmessage();
			die();
		}
		$this->db->query('set names utf8');
		return $this;
	}
	
}


вызов такой
$DB = new DB();
$news = $DB->select('*')->from('news')->orderBy('date')->paginate(9)->start();


Хочу избавиться от start() в конце и сделать чтоб она запускалась всегда и без ее объяления
  • Вопрос задан
  • 340 просмотров
Пригласить эксперта
Ответы на вопрос 1
Коротко - нет.

Давайте с Вами разберемся сначала, как Вы себе это представляете =)
Допустим, мы нашли способ вызывать нечто автоматически, чтобы избавится от вашего start() (кстати, start() наверное не очень подходящее название, имхо, но в данном случае get() как-то логичней). Тогда резонно встает вопрос, в какой момент вызывать эту функцию? Перед сборкой мусора\уничтожением объекта? Тогда у Вам придется ждать до тех пор, пока приложение не решит собрать мусор, или, опять таки, явно уничтожать объект. А PHP выполняет операции синхронно(если не задаваться целью делать это асинхронно), соответственно, конечный пользователь будет ждать. И прождать он может долго.
Или может попробуем в конце вызова каждой функции из цепочки? Тогда проблема в том, что вы сделаете множество запросов к базе.

А вообще - посмотрите, как реализованы компоненты QueryBuilder в попоулярных фреймворках и вы увидите, что в них всех в итоге надо использовать какой-то метод, наподобии вашего start()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Etton Казань
от 100 000 ₽
Смокинг Казань
от 120 000 до 150 000 ₽
Plesk Новосибирск
от 150 000 до 300 000 ₽
20 сент. 2021, в 16:10
1000 руб./за проект
20 сент. 2021, в 16:07
140000 руб./за проект
20 сент. 2021, в 16:02
300000 руб./за проект