PHP ошибкак "Access to undeclared static property"
Ошибка на первом скрине
Fatal error: Uncaught Error: Access to undeclared static property application\models\Account::$db in E:\IT\OpenServer\domains\bookshop\application\models\Account.php:9 Stack trace: #0 E:\IT\OpenServer\domains\bookshop\application\controllers\AccountController.php(31): application\models\Account::addUser() #1 E:\IT\OpenServer\domains\bookshop\application\core\Router.php(58): application\controllers\AccountController->signupAction() #2 E:\IT\OpenServer\domains\bookshop\index.php(16): application\core\Router->run() #3 {main} thrown in E:\IT\OpenServer\domains\bookshop\application\models\Account.php on line 9
Signup.php (примитивный класс регистрации)
<?php
namespace application\core;
use application\models\Account;
use application\controllers\AccountController;
//use User;
//use AccountController;
//use application\lib\Db;
//require_once '../controllers/AccountController.php';
// require_once '../models/Account.php';
class Signup extends Account
{
public static function checkEmpty() : bool {
if (!empty($nickname) && !empty($login) && !empty($password) && !empty($email)) {
return true;
}
return false;
}
public static function checkNickname($nickname) : bool {
if (!(strlen($nickname) > 32)) {
if (preg_match("/^[a-zа-яё\d]{1}[a-zа-яё\d\s]*[a-zа-яё\d]{1}$/i", $nickname)) {
return true;
}
}
return false;
}
public static function checkLogin($login) : bool {
if (!(strlen($login) > 32)) {
if(!(preg_match('~[\\\/:*?"\'<>|]~', $login))) {
return true;
}
}
return false;
}
public static function checkPassword($password) : bool {
if (!(strlen($password) > 64)) {
return true;
}
return false;
}
public static function checkEmail($email) : bool {
if (!(strlen($email) > 256)) {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
return true;
}
}
return false;
}
}
AccountController.php
<?php
namespace application\controllers;
use application\core\Controller;
use application\core\Signup;
use application\models\Account;
class AccountController extends Controller
{
public function loginAction() : void {
$vars = [
'style' => '/public/styles/accountStyle.css',
];
$this->view->render('login', $vars);
}
public function signupAction() : void {
isset($_POST['nickname']) ? $nickname = $_POST['nickname'] : null;
isset($_POST['login']) ? $login = $_POST['login'] : null;
isset($_POST['password']) ? $password = $_POST['password'] : null;
isset($_POST['email']) ? $email = $_POST['email'] : null;
if (!Signup::checkNickname($nickname)) {$_SESSION['warning']['signup'] = "nick";}
else if (!Signup::checkLogin($login)) {$_SESSION['warning']['signup'] = "login";}
else if (!Signup::checkPassword($password)) {$_SESSION['warning']['signup'] = "pass";}
else if (!Signup::checkEmail($email)) {$_SESSION['warning']['signup'] = "email";}
else {$_SESSION['warning']['signup'] = "SUCCESS";}
//if (!Signup::checkEmpty()) {$_SESSION['warning']['signup'] = "empty";}
if (Account::addUser($nickname, $login, $password, $email)) {
$_SESSION['warning']['signup'] = "Полный успех";
} else { $_SESSION['warning']['signup'] = "Неудачная регистрация"; }
$vars = [
'style' => '/public/styles/accountStyle.css',
];
$this->view->render('signup', $vars);
}
}
Account.php
<?php
namespace application\models;
use application\core\Model;
class Account extends Model
{
public static function addUser($nickname, $login, $password, $email) {
self::$db->sql("INSERT INTO users (nickname, login, password, email)
VALUES (?, ?, ?, ?)", [$nickname, $login, $password, $email]);
}
}
Model.php
<?php
namespace application\core;
use application\lib\Db;
abstract class Model
{
public $db;
public function __construct()
{
// Объявляем переменную $db для хранения базы данных
$this->db = new Db;
}
}
Db.php
<?php
namespace application\lib;
use PDO;
class Db
{
public $db;
public function __construct() {
$config = require 'application/config/db.php';
$this->db = new PDO(
'pgsql:host=' . $config['host'] . SPACE .
'port=' . $config['port'] . SPACE .
'dbname=' . $config['dbname'] . SPACE .
'user=' . $config['user'] . SPACE .
'password=' . $config['password']
);
}
public function query($stmt) {return self::$db->query($stmt);}
public function prepare($stmt) {return self::$db->prepare($stmt);}
public function exec($query) {return self::$db->exec($query);}
public function run($query, $args = []) {
if(!$args) {return self::query($query);}
$stmt = self::prepare($query);
$stmt->execute($args);
return $stmt;
}
public function GetRow($query, $args = []) {return self::run($query, $args)->fetch();}
public function GetRows($query, $args = []) {return self::run($query, $args)->fetchAll();}
public function GetColumn($query, $args = []) {return self::run($query, $args)->fetchAll(PDO::FETCH_COLUMN);}
public function sql($query, $args = []) {self::run($query, $args);}
}
Ответы (1 шт):
Выберите, что подходит для вас из списка ниже и почините ошибку:
- К нестатическим публичным свойствам и методам класса за их пределами и за пределами наследников можно обращаться только после создания экземпляра с помощью стрелочки
->. Например(new User)->test(); - К нестатическим свойствам и методам класса внутри этого класса можно обращаться с помощью ключевого слова
$thisи стрелочки->. Например$this->test(); - К нестатическим публичным/защищённым свойствам и методам родителя внутри наследника можно обращаться с помощью ключевого слова
$thisи стрелочки->. Например$this->test();
- К статическим публичным свойствам и методам класса за их пределами и за пределами наследников можно обращаться синтаксисом:
ИМЯ_КЛАССА::ИМЯ_СВОЙСТВАилиИМЯ_КЛАССА::ИМЯ_МЕТОДА. НапримерUser::$nameилиUser::test()` - К статическим публичным свойствам и методам класса внутри этого класса можно обращаться синтаксисом:
self::ИМЯ_СВОЙСТВАилиself::ИМЯ_МЕТОДАstatic::ИМЯ_СВОЙСТВАилиstatic::ИМЯ_МЕТОДА. Напримерself::$dbилиself::getName() - К статическим публичным/защищённым свойствам и методам родителя внутри наследника класса можно обращаться синтаксисом:
self::ИМЯ_СВОЙСТВАилиself::ИМЯ_МЕТОДАstatic::ИМЯ_СВОЙСТВАилиstatic::ИМЯ_МЕТОДА. Напримерself::$connectionилиself::logout()

