如何在PHP中实现动态绑定?

如何在PHP中实现动态绑定?,php,model-view-controller,Php,Model View Controller,我正在尝试用PHP开发一个小的MVC站点来处理密码。(没有类似于Laravel或类似的框架,用于学习目的) 为此,我至少编写了4个类和一个索引文件: 控制器->要扩展的基类,包含控制器的所有基本逻辑 索引->一个控制器类,用于处理普通用户的登录 Admin->一个控制器类,用于处理管理员用户的登录 引导->一个解释传递的url并用作路由器的类 这些类别如下所示: libs/Controller.php <?php class Controller { protected $vi

我正在尝试用PHP开发一个小的MVC站点来处理密码。(没有类似于Laravel或类似的框架,用于学习目的)

为此,我至少编写了4个类和一个索引文件:

控制器->要扩展的基类,包含控制器的所有基本逻辑

索引->一个控制器类,用于处理普通用户的登录

Admin->一个控制器类,用于处理管理员用户的登录

引导->一个解释传递的url并用作路由器的类

这些类别如下所示:

libs/Controller.php

<?php

class Controller {

    protected $view;
    protected $security_level;

    function __construct() {
        $this->security_level = 0;
    }

    public function model($model) {
        $path = 'models/' . ucfirst($model). '.php';
        if (file_exists($path)) {
            require_once ($path);
            return new $model();
        }   
    }

    public function getSecurityLevel(){
        return $this->securiy_level;
    }

    public function view($view, $data = []){
        require_once('views/commom/header.php');
        require_once('views/' . $view . '.php');
        require_once('views/commom/footer.php');
    }

}
这是我的实际退出,当我尝试访问页面“”时:

对象(索引)#2(2){[“视图”:受保护]=>NULL [“安全级别”:受保护]=>int(0)}

数组(12){[0]=>string(11)“\uu构造”[1]=>string(5)“索引” [2] =>字符串(5)“管理员”[3]=>字符串(5)“登录”[4]=>字符串(9) “登录”[5]=>string(6)“登录”[6]=>string(6)“注销”[7]=> 字符串(14)“lostMyPassword”[8]=>字符串(7)“详细信息”[9]=>字符串(5) “模型”[10]=>string(16)“getSecurityLevel”[11]=>string(4)“视图”}

**注意:第21行的/var/www/html/libs/Controller.php中未定义的属性:索引::$securiy_level**NULL

**注意:第21行的/var/www/html/libs/Controller.php中未定义的属性:索引::$securiy_level**NULL

我无法理解的是PHP如何向我显示
$controller
变量具有我想要访问的属性,我有进行访问的方法,但我无法访问。当PHP显示“Index::$securiy_level”时,什么是“静态”绑定

我知道PHP中的作用域(至少有一点)。 我打算在控制器类中使用变量“$security_level”,为所有子控制器提供一个默认值。如果程序员不想显式声明$security_level的不同值,他/她不必担心,只需使用父亲的属性即可

我的配置是:PHP7,Ubuntu 16,apache2

任何帮助我都会提前感谢

如果我的问题不清楚,请也发表评论以澄清任何问题

*Obs.:请注意,当我尝试访问“”时,输出为:

对象(管理)#2(4){[“加密单元”:“管理”:私有]=> 对象(加密机)#3(2){[“加密机密钥”:“加密机”:专用]=> 字符串(20)“RmUzYm1hcUxnY3ZYcA=” [“加密算法”:“加密机”:专用]=>string(11)“aes-256-cbc”} [“视图”:受保护]=>NULL[“安全级别”:受保护]=>int(0) [“安全级别”]=>int(1)}

数组(11){[0]=>string(11)“\uu构造”[1]=>string(5)“索引” [2] =>字符串(6)“创建”[3]=>字符串(7)“恢复”[4]=>字符串(6) “更新”[5]=>string(17)“更新凭据”[6]=>string(6)“删除” [7] =>字符串(6)“搜索”[8]=>字符串(5)“模型”[9]=>字符串(16) “getSecurityLevel”[10]=>字符串(4)“视图”}int(1)int(1)


控制器中有一个输入错误,
return$this->securiy\u level应该是
返回$this->security\u级别;)

很抱歉,但我很怀疑有人会看完这一切。请尝试将您的问题缩小到特定的范围,并确保所包含的代码与特定的问题相关。这是一堵巨大的代码墙,供人们尝试和通过。请创建一个,我们可以看看你。天哪,我不相信这个愚蠢的错误是造成这么多的困惑,为我。!!!非常感谢@Rarst。@Rarst打字错误应该以适当的理由(在“主题外”下)结束,并附上一条评论。@PatrickQ明白了,我不太熟悉如此接近的理由,不知道那个:)
<?php

class Index extends Controller {

    public function __construct() {
        parent::__construct();
        $this->model('UserModel');
        //$this->securiy_level = 0;
    }

    public function index($error = 0) {
        $this->view('index/index', ['error' => $error]);
    }

    public function admin($error = 0) {
        $this->view('index/index_adm', ['error' => $error]);
    }

    public function login(){
        $auth = new Authentication();
        $permission = $auth->authenticate("user");
        if($permission){
            header("location: /account/index");
        }
        else{
            $this->index(1);
        }
    }

    public function login_adm(){
        $auth = new Authentication();
        $permission = $auth->authenticate("admin");
        if($permission){
            header("location: /admin/index");
        }
        else{
            $this->admin(1);
        }
    }

    public function signin(){
        echo "method sign in invoked <br />";
    }

    public function logout(){
        $this->view('index/logout');
    }

    public function lostMyPassword(){
        echo "method lost invoked <br />";  
    }

    public function details() {
        $this->view->view('index/index');
    }

}
<?php

//I Think that this is VERY wrong, but okay
@session_start();

class Admin extends Controller {

    private $encrypt_unit;

    public function __construct() {
        parent::__construct();
        $this->model('UserModel');
        $this->encrypt_unit = new Encrypter();
        $this->securiy_level = 1;
    }

    public function index($msg = "", $err = false){
        $users = $this->recover();
        $this->view('admin/index', ["msg" => $msg, "err" => $err, "users" => $users]);
    }

    public function create(){
        $user_var = new UserModel();
        $user_var->setLogin($_POST["login"]);
        $user_var->setEmail($_POST["email"]);
        $user_var->setPassword($this->encrypt_unit->encrypt($_POST["password"]));
        $user_var->setIsAdmin($_POST["isAdmin"]);

        $user_dao = new UserDAO();
        $flag = $user_dao->insertUser($user_var);

        if($flag)
            $this->index("User created successfully", false);
        else
            $this->index("Can't created user, please try again", true);
    }

    public function recover(){
        $user_dao = new UserDAO();
        $all_users = $user_dao->getUsers();

        $users = array();
        foreach ($all_users as $value) {
            array_push($users, [
            "id" => $value->getId(),
            "login" => $value->getLogin(),
            "email" => $value->getEmail(),
            "password" => $this->encrypt_unit->decrypt($value->getPassword()),
            "isAdmin" => $value->getIsAdmin()
            ]);
        }

        return $users;
    }

    public function update(){
        $user_var = new UserModel();
        $user_var->setId($_POST["id"]);
        $user_var->setLogin($_POST["login"]);
        $user_var->setEmail($_POST["email"]);
        $user_var->setPassword($this->encrypt_unit->encrypt($_POST["password"]));

        $user_dao = new UserDAO();
        $flag = $user_dao->updateUser($user_var);

        if($flag)
            $this->index("User updated successfully", false);
        else
            $this->index("Can't updated user, please try again", true);
    }

    public function update_credential($credential_level){
        $user_var = new UserModel();
        $user_var->setId($_POST["id"]);
        $user_var->setIsAdmin($credential_level);

        $user_dao = new UserDAO();
        $flag = $user_dao->updateUserCredential($user_var);

        if($flag)
            $this->index("User updated successfully", false);
        else
            $this->index("Can't updated user, please try again", true);
    }

    public function delete(){
        $user_var = new UserModel();
        $user_var->setId($_POST["id"]);

        $user_dao = new UserDAO();
        $flag = $user_dao->deleteUser($user_var);

        if($flag)
            $this->index("User deleted successfully", false);
        else
            $this->index("Can't deleted user, please try again", true);
    }

    public function search(){
        echo "method search invoked <br />";
    }

}
<?php

class Bootstrap {

    // protected $controller;
    // protected $method;
    // protected $params;

    function __construct() {
        //$this->method = 'index';
        $this->redirect();
    }

    public function parseUrl(){

        return isset($_GET['url']) ? explode('/',filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL)) : null;
    }

    function redirect(){

        $controller;
        $method;
        $params;

        $url = $this->parseUrl();

        if(empty($url[0])){
            $controller_name = 'Index';
        }
        else{
            $controller_name = ucfirst($url[0]);
        }

        $filename_controller = 'controllers/' . $controller_name . '.php';

        if (file_exists($filename_controller)) {
            require_once($filename_controller);
            // Do this to use the rest of array to select method, and than parameters
            unset($url[0]);
        }
        else{
            $this->error("Controller $controller_name not founded");
            return false;
        }

        $controller = new $controller_name;

        //default method
        $method = 'index';

        if(isset($url[1])){
            if (method_exists($controller, $url[1])) {
                $method = $url[1];
                // Do this to use the rest of array to select parameters
                unset($url[1]);
            }
            else{
                $this->error("The controller $controller_name doesn't have any public method called $url[1]");
            }
        }

        //This 'array_values($url)' command is possible because we have unseted the first and second position of this aray before
        $params = $url ? array_values($url) : [];

        // Securiy comparassion?
        var_dump($controller);
        var_dump(get_class_methods($controller));
        var_dump($controller->getSecurityLevel());
        var_dump($controller->{"getSecurityLevel"}());
        // if(property_exists($controller, "securiy_level")){
        //  $authEntity = new Authentication();
        //  $authEntity->auth($controller->getSecurityLevel());
        // }

        //(new $url[0])->{$url[1]}($url[2]);
        call_user_func_array([$controller, $method], $params);
    }

    function error($msg="") {
        //echo "error invoked: <br /> $msg <br />";
        require_once('controllers/Error.php');
        $errorHandler = new ErrorController();
        $errorHandler->index();
        return false;
    }

}
<?php

// Use an autoloader!
require_once('libs/Bootstrap.php');
require_once('libs/Controller.php');
require_once('libs/Model.php');
require_once('libs/View.php');

// Library
require_once('libs/Database.php');
require_once('libs/ConnectionDB.php');
require_once('libs/Session.php');
require_once('libs/Authentication.php');
require_once('libs/Encrypter.php');

require_once('config/paths.php');
require_once('config/database.php');
require_once('config/passwords.php');

// DAOS
require_once('daos/UserDAO.php');
require_once('daos/AccountDAO.php');


$app = new Bootstrap();
var_dump($controller->getSecurityLevel()); //or
var_dump($controller->{"getSecurityLevel"}());