Как правильно пользоваться классами в php?

279
26 декабря 2017, 18:06

Изучаю работу функций, решил сделать некое API для своего движка. Вот так выглядит сама функция:

class le {
public function query($sql, $params)
{
    $query = $db->prepare($sql);
    $query->execute($params);
    return $query;
}
}

Теперь пытаюсь вызвать функцию в классе:

$engine = new le;
$banned = $engine->query("SELECT * FROM `bans` WHERE ip = ?", array(
    $_SERVER['REMOTE_ADDR']
))->fetch(PDO::FETCH_ASSOC);

И тут функции query нужно значение $db, которое должно быть таким:

$db   = new PDO('mysql:host='.$set['db']['host'].';dbname='.$set['db']['name'].';charset=utf8',$set['db']['user'],$set['db']['pass']);

Мне интересно, можно ли как-то при вызове функции new le; хранить переменную в самом классе? Примерно как-то так:

class le {
$db   = new PDO('mysql:host='.$set['db']['host'].';dbname='.$set['db']['name'].';charset=utf8',$set['db']['user'],$set['db']['pass']);
public function query($sql, $params)
{
    global $db;
    $query = $db->prepare($sql);
    $query->execute($params);
    return $query;
}
}

Однако данный код вызывает ошибку по типу:

Parse error: syntax error, unexpected '$set' (T_VARIABLE), expecting function (T_FUNCTION) in C:\servers\WWW\engine\engine.php on line 4

Можете показать, как надо записывать такие переменные в классы?

UPD. Как я понял надо писать что-то типо того:

class le {
function __construct() {
$set  = json_decode(file_get_contents('engine/settings.json'), true);
$lang = json_decode(file_get_contents('engine/languages/'.$set['ui']['language'].'.json'), true);
$tpl  = unserialize(file_get_contents('engine/templates/'.$set['ui']['template'].'.serialize'));
$db   = new PDO('mysql:host='.$set['db']['host'].';dbname='.$set['db']['name'].';charset=utf8',$set['db']['user'],$set['db']['pass']);
}
public function query($sql, $params)
{
    $query = $this->$db->prepare($sql);
    $query->execute($params);
    return $query;
}
....

Fatal error: Uncaught Error: Cannot access empty property in C:\servers\WWW\engine\engine.php:13 Stack trace: #0 C:\servers\WWW\index.php(5): le->query('SELECT * FROM `...', Array) #1 {main} thrown in C:\servers\WWW\engine\engine.php on line 13
Answer 1

Разобрался сам, спасибо за подсказки по поводу $this.

<?php
class le {
public function __construct()
{
$this->set  = json_decode(file_get_contents('engine/settings.json'), true);
$this->lang = json_decode(file_get_contents('engine/languages/'.$this->set['ui']['language'].'.json'), true);
$this->tpl  = unserialize(file_get_contents('engine/templates/'.$this->set['ui']['template'].'.serialize'));
$this->db   = new PDO('mysql:host='.$this->set['db']['host'].';dbname='.$this->set['db']['name'].';charset=utf8',$this->set['db']['user'],$this->set['db']['pass']);
}
public function query($sql, $params)
{
    $query = $this->db->prepare($sql);
    $query->execute($params);
    return $query;
}
public function ndate($a)
{
    date_default_timezone_set('Europe/Moscow');
    $ndate = date('d.m.Y', $a);
    $ndate_time = date('H:i', $a);
    $ndate_exp = explode('.', $ndate);
    $nmonth = array(
        1 => 'янв',
        2 => 'фев',
        3 => 'мар',
        4 => 'апр',
        5 => 'мая',
        6 => 'июн',
        7 => 'июл',
        8 => 'авг',
        9 => 'сен',
        10 => 'окт',
        11 => 'ноя',
        12 => 'дек'
    );
    foreach($nmonth as $key => $value)
    if ($key == intval($ndate_exp[1])) $nmonth_name = $value;
    if ($ndate == date('d.m.Y')) return 'сегодня в ' . $ndate_time;
    elseif ($ndate == date('d.m.Y', strtotime('-1 day'))) return 'вчера в ' . $ndate_time;
    else return $ndate_exp[0] . ' ' . $nmonth_name . ' ' . $ndate_exp[2] . ' в ' . $ndate_time;
}
public function views($value)
{
    if ($value >= 1000) return round($value / 1000, 1).'K';
    else return $value;
}
public function json($url)
{
$cURL = curl_init();
curl_setopt($cURL, CURLOPT_URL, $url);
curl_setopt($cURL, CURLOPT_HTTPGET, true);
curl_setopt($cURL, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Accept: application/json'
));
curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($cURL);
curl_close($cURL);
return json_decode($result, true);
}
public function cache($function, $content) {
if (is_null($content)) {
$cache = $this->query('SELECT expires FROM cache WHERE function = ?',array($function))->fetch(PDO::FETCH_ASSOC)['expires'];
if (is_null($cache)) {
$this->query('INSERT INTO `cache`(`function`, `expires`) VALUES (?,?)',array($function, time() - $set['int']['cache_time']));
return time() - $set['int']['cache_time'];
}
else return $cache;
}
else if (!is_null($content)) {
file_put_contents('engine/cache/'.$function.'.html', $content);
$this->query('UPDATE `cache` SET `expires`= ? WHERE function = ?',array(time() + $set['int']['cache_time'], $function));
}
}
}
?>
READ ALSO
Распарсить значение в MySql

Распарсить значение в MySql

Всем приветЕсть таблица новости, есть столбец text Значение такое

188
Интерпретатор PHP в Netbeans

Интерпретатор PHP в Netbeans

Как подключить интерпретатор? Скачал PHP для NetbeansНе могу понять, что выбрать при его подключении

160
Как к 7 дням недели присвоить имя?

Как к 7 дням недели присвоить имя?

Как присвоить числовое имя к 7 дням недели например 7 = 1, следующие 7 дней = 2 как пронумеровать недели в году?

134
PHP. Оптимизация изображений с помощью Imagick

PHP. Оптимизация изображений с помощью Imagick

Для оптимизации изображений использую PHP расширение Imagick, Imagick::setImageCompression устанавливает сжатие на изображение, в качестве параметра принимает...

147