从另一个类调用非对象的成员函数

时间:2012-06-18 16:34:36

标签: php

我正在学习oop并尝试实施php标准PSR-0& PSR-1一路走来。我首先创建了一个基于Swiftlet的小型MVC框架。

我试图从控制器中的基本View控制器中调用我从url调用的函数,然后在'。

中调用非对象的成员函数set()。

所有类加载都可以。所以在我的控制器中我叫$ this-> view-> set('helloWorld','Hello world!');但是我收到了一个错误。我在尝试使命名空间结构正确时遇到了一些麻烦,所以这可能是原因吗?

这是文件结构:

的index.php

LIB / bootstrap.php中

LIB / view.php

LIB / Controller.php这样

应用程序/控制器/ index.php的

以下是每个代码:

的index.php

<?php

namespace MVC;

    // Bootstrap the application
    require 'lib/Bootstrap.php';

    $app = new lib\Bootstrap;

    spl_autoload_register(array($app, 'autoload'));

    $app->run();
    $app->serve();

bootstrap.php中

namespace MVC\lib;

class Bootstrap 
{
    protected
        $action     = 'index',
        $controller,
        $hooks      = array(),
        $view
        ;

    /**
     * Run the application
     */

    function run() 
    {
               ... Code that gets controller and the action form the url

        $this->view = new \lib\View($this, strtolower($controllerName));

        // Instantiate the controller
        $controllerName = 'app\Controllers\\' . basename($controllerName);

        $this->controller = new $controllerName();                      

        // Call the controller action
        $this->registerHook('actionBefore');

        if ( method_exists($this->controller, $this->action) ) {
            $method = new \ReflectionMethod($this->controller, $this->action);

            if ( $method->isPublic() && !$method->isFinal() && !$method->isConstructor() ) {
                $this->controller->{$this->action}();
            } else {
                $this->controller->notImplemented();
            }
        } else {
            $this->controller->notImplemented();
        }

        return array($this->view, $this->controller);

    }


<?php

namespace MVC\lib;

class Bootstrap 
{
    protected
        $action     = 'index',
        $args       = array(),
        $config     = array(),
        $controller,
        $hooks      = array(),
        $plugins    = array(),
        $rootPath   = '/',
        $singletons = array(),
        $view
        ;

    /**
     * Run the application
     */

    function run() 
    {
        // Determine the client-side path to root
        if ( !empty($_SERVER['REQUEST_URI']) ) {
            $this->rootPath = preg_replace('/(index\.php)?(\?.*)?$/', '', $_SERVER['REQUEST_URI']);

            if ( !empty($_GET['route']) ) {
                $this->rootPath = preg_replace('/' . preg_quote($_GET['route'], '/') . '$/', '', $this->rootPath);
            }
        }

        // Extract controller name, view name, action name and arguments from URL
        $controllerName = 'Index';

        if ( !empty($_GET['route']) ) {
            $this->args = explode('/', $_GET['route']);

            if ( $this->args ) {
                $controllerName = str_replace(' ', '/', ucwords(str_replace('_', ' ', str_replace('-', '', array_shift($this->args)))));
            }

            if ( $action = $this->args ? array_shift($this->args) : '' ) {
                $this->action = str_replace('-', '', $action);
            }
        }

        if ( !is_file('app/Controllers/'. $controllerName . '.php') ) {
            $controllerName = 'Error404';
        }

        $this->view = new \lib\View($this, strtolower($controllerName));

        // Instantiate the controller
        $controllerName = 'app\Controllers\\' . basename($controllerName);

        $this->controller = new $controllerName();                      

        // Call the controller action
        $this->registerHook('actionBefore');

        if ( method_exists($this->controller, $this->action) ) {
            $method = new \ReflectionMethod($this->controller, $this->action);

            if ( $method->isPublic() && !$method->isFinal() && !$method->isConstructor() ) {
                $this->controller->{$this->action}();
            } else {
                $this->controller->notImplemented();
            }
        } else {
            $this->controller->notImplemented();
        }

        $this->registerHook('actionAfter');

        return array($this->view, $this->controller);

    }

<?php

namespace MVC\lib;

class Bootstrap 
{
    protected
        $action     = 'index',
        $args       = array(),
        $config     = array(),
        $controller,
        $hooks      = array(),
        $plugins    = array(),
        $rootPath   = '/',
        $singletons = array(),
        $view
        ;

    /**
     * Run the application
     */

    function run() 
    {
        // Determine the client-side path to root
        if ( !empty($_SERVER['REQUEST_URI']) ) {
            $this->rootPath = preg_replace('/(index\.php)?(\?.*)?$/', '', $_SERVER['REQUEST_URI']);

            if ( !empty($_GET['route']) ) {
                $this->rootPath = preg_replace('/' . preg_quote($_GET['route'], '/') . '$/', '', $this->rootPath);
            }
        }

        // Extract controller name, view name, action name and arguments from URL
        $controllerName = 'Index';

        if ( !empty($_GET['route']) ) {
            $this->args = explode('/', $_GET['route']);

            if ( $this->args ) {
                $controllerName = str_replace(' ', '/', ucwords(str_replace('_', ' ', str_replace('-', '', array_shift($this->args)))));
            }

            if ( $action = $this->args ? array_shift($this->args) : '' ) {
                $this->action = str_replace('-', '', $action);
            }
        }

        if ( !is_file('app/Controllers/'. $controllerName . '.php') ) {
            $controllerName = 'Error404';
        }

        $this->view = new \lib\View($this, strtolower($controllerName));

        // Instantiate the controller
        $controllerName = 'app\Controllers\\' . basename($controllerName);

        $this->controller = new $controllerName();                      

        // Call the controller action
        $this->registerHook('actionBefore');

        if ( method_exists($this->controller, $this->action) ) {
            $method = new \ReflectionMethod($this->controller, $this->action);

            if ( $method->isPublic() && !$method->isFinal() && !$method->isConstructor() ) {
                $this->controller->{$this->action}();
            } else {
                $this->controller->notImplemented();
            }
        } else {
            $this->controller->notImplemented();
        }

        $this->registerHook('actionAfter');

        return array($this->view, $this->controller);

    }

LIB / view.php

namespace lib;

class View 
{
    protected
        $app,
        $variables = array()
        ;

    public
        $name
        ;

    /**
     * Constructor
     * @param object $app
     * @param string $name
     */
    public function __construct($app, $name)
    {
        $this->app  = $app;
        $this->name = $name;
    }


    /**
     * Set a view variable
     * @param string $variable
     * @param mixed $value
     */
    public function set($variable, $value = null)
    {
        $this->variables[$variable] = $value;
    }

最后是app / controllers / index.php

namespace app\Controllers;

class index extends \lib\Controller

{

    public function test()

    {
           // This gets the error
                   $this->view->set('helloWorld', 'Hello world!');  
    }

}

1 个答案:

答案 0 :(得分:0)

如果这是控制器中的所有代码,则$this->view不是对象 尝试运行以下代码:

namespace app\Controllers;

class index extends \lib\Controller
{
    public function test()
    {
           var_dump( $this->view );
           exit;
           $this->view->set('helloWorld', 'Hello world!');  
    }

}

您还应该知道,在PHP中,__construct()方法不会被继承。 我必须受到一些脑损伤。

哦..我没看到,为什么这个问题有标签。当你试图编写类似MVC的东西时,问题本身与MVC没有关系作为架构模式。