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()
→ Ссылка