НЕУСТРАНИМАЯ ОШИБКА: объект класса mysqli не удалось преобразовать в строку

#php #mysql #oop

#php #mysql #ооп

Вопрос:

Я пытаюсь начать с ООП, потому что это кажется намного лучше, чем способ, которым я обычно кодировал, но теперь я пытаюсь создать класс подключения mysql, и я получаю ту же ошибку снова и снова.

Я использую 2 класса: 1 для соединения, а другой для запросов.

Пользователи класса (запросы)

 class Users{
protected $_userid, $_username, $_lastLogged, $_rank, 
$_driverLicense, $_experience, $_maxExperience, 
$_cash, $_vehicle, $_residence, $_weapon, $_tool, 
$_memberSince, $_about;

var $con;

function getConnection($con){
    return $this->$con;
}

function checkLogin($username, $password){
    $stmtCheckLogin = $this -> getConnection() -> prepare('SELECT `id`, `password` FROM `tbl_users` WHERE `username` = ? ');
    $stmtCheckLogin -> bind_param('s', $username);
    $stmtCheckLogin -> execute();
    $stmtCheckLogin -> bind_result($id, $password);
    $stmtCheckLogin -> store_result();
    $stmtCheckLogin -> fetch(); // just a test to see if everything is working correctly
    echo $id. "<br/>";
    echo $password;
}

 }
  

Класс db (подключение)
класс db{

 function getCon(){
    $con = new mysqli('127.0.0.1', 'root', '', 'mafioso');
    if(!$con){
        throw new Exception('Could not connect to database..');
    }else{
        return $con;
    }
}

function __destruct(){
    $this -> getCon() -> close();
}
}
  

И вот как я пытаюсь их вызвать

 <?php require_once('classes/User.php'); require_once('classes/db.php');

    $db = new db;
    $user = new Users();
    $user -> getConnection($db -> getCon());
    if(!isset($_SESSION['checkLogin']) || ($_SESSION['checkLogin'] == 0)){


    if(isset($_POST['login'])){
        $user -> checkLogin($_POST['username'], $_POST['password']);
    }
    ?>
  

И это ошибка, которую я продолжаю получать:

  Catchable fatal error: Object of class mysqli could not be converted to string in classesUser.php on line 12
  

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

1. Какова строка 12 вашего User.php файл?

2. Это строка 12 ‘return $this->$con;’

3. Пожалуйста , не пиши $obj -> method/attribute . Пишите $obj->method/attribute .

4. @OptimusCrime Есть ли веская причина не делать этого? (Потому что для меня использование пробелов просто выглядит странно, но я не понимаю, почему это может вызвать проблемы)

5. @Anwar . Просто общие стандарты кода. Вы написали, что просто уставились на ООП. Лучше не иметь никаких вредных привычек с самого начала. Вы можете прочитать больше о стандартах здесь: php-fig.org/psr/psr-1

Ответ №1:

$this->$con; должно быть $this->con; .

Весь метод, похоже, представляет собой гибрид getter / setter, который не будет работать.

Существуют методы получения для получения свойства, подобного:

 function getConnection() {
    return $this->con;
}
  

и методы setter для установки значения свойства, подобного

 function setConnection($con) {
    return $this->con = $con;
}
  

$this это текущий класс, в котором вы находитесь. С помощью -> вы можете обращаться к методам и / или свойствам. Но вам не нужно писать $ снова, потому что $this-> уже подразумевает, что это переменная или метод.

Другие подсказки для well don’t OO:

  • Укажите области ваших свойств, такие как public , private или protected .
  • Напишите $this->obj и не $this -> obj
  • Не вызывайте методы получения, подобные getConnection() , в собственном классе. Вы можете просто использовать $this->con вместо

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

1. почему вы должны писать $obj->method вместо $obj -> method ? Для меня второе намного более понятно / читабельно… Но, возможно, это только у меня…

2. @Mathlight потому что это селектор переменной / метода и один оператор, и в них нет пробелов. Вы также не пишете $ obj . Насколько мне известно, нет проекта с открытым исходным кодом, который использовал бы $obj -> method style.

3. Хорошо, в этом вы правы… Вы не часто найдете это в проектах. И если я исправлю это правильно, это действительно какой-то стандарт кодирования, позволяющий не использовать пробел. Но все же.. Это лучше читается… (я думаю)

4. Это ваше мнение, я не хочу его уничтожать, так что сделайте это, если вам нравится быть бунтарем 😉

5. Я, например, не думаю, что пробелы более удобочитаемы. И на самом деле, это делает более понятным отсутствие пробелов, поскольку очень ясно показывает, что свойство или метод прикреплен к объекту

Ответ №2:

Проблема возникает из getConnection метода:

 function getConnection($con){
    return $this->$con;
}
  

Это возвращает свойство с именем, которое $con содержит.
Т.е. если $con = 'foo'; тогда этот метод вернет $this->foo .

В вашем случае PHP пытается преобразовать соединение в строку, чтобы он мог получить доступ к соответствующему свойству. объекты mysqli не могут быть преобразованы в строку, поэтому выдается неустранимая ошибка.

Вероятно, вам нужен setConnection, который правильно устанавливает соединение, и getConnection, который возвращает con.

Попробуйте:

 function getConnection(){
    return $this->con;
}
function setConnection($con){
    $this->con = $con;
}
  

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

1. Но я не устанавливаю $ con в том же классе. Я установил $con в классе db. Я только хочу получить его из этого класса 🙂

2. @Anwar Извините, я должен был выразиться яснее. При первоначальном вызове пользователя вы должны были бы сделать: $user->setConnection($db->getCon()); после этого все вызовы в $user могут просто использовать $this->getConnection()

Ответ №3:

Этот фрагмент кода неверен:

 function getConnection($con)
{
    return $this->$con;
}
  

Потому что вы предоставляете getConnection экземпляр mysqli. Поэтому в $this->$con он пытается преобразовать $con в строку, но $con является экземпляром mysqli.

Может быть, вы хотите что-то вроде этого:

 function setConnection($con)
{
    $this->con = $con;
}

function getConnection()
{
    return $this->con;
}
  

Потому что вы используете $this->getConnection() в checkLogin() .