#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()
.