【问题标题】:Dynamic method call in OOPOOP 中的动态方法调用
【发布时间】:2011-07-19 17:05:39
【问题描述】:

我在 PHP 中的 OOP 编程方面没有太多经验,我的搜索没有给出任何结果,而是直接方法的解决方案。我需要的是这个:

// URL Decides which controller method to load
$page = $_GET['page'];

// I want to load the correct controller method here
$this->$page();

// A method
public function home(){}

// Another method
public function about(){}

// e.g. ?page=home would call the home() method

编辑:我已经尝试了几个建议,但我得到的是内存过载错误消息。这是我的完整代码:

<?php

class Controller {

    // Defines variables
    public $load;
    public $model;

    public function __construct() {

        // Instantiates necessary classes
        $this->load     = new Load();
        $this->model    = new Model();

        if (isset($_GET['page'])) {

            $page = $_GET['page'];

            $fc = new FrontController; // This is what crashes apparently, tried with and without ();

        }

    }

}

【问题讨论】:

    标签: php oop


    【解决方案1】:

    如果我正确理解您的问题,您可能想要更多类似的内容:

    class FrontController {
        public function home(){ /* ... */ }
        public function about(){ /* ... */ }
    }
    
    $page = $_GET['page'];
    $fc = new FrontController;
    if( method_exists( $fc, $page ) ) {
        $fc->$page();
    } else {
        /* method doesn't exist, handle your error */
    }
    

    这就是你要找的吗?该页面将查看传入的 $_GET['page'] 变量,并检查您的 FrontController 类是否具有名为 $_GET['page'] 的方法。如果是这样,它将被调用;否则,您需要对错误执行其他操作。

    【讨论】:

      【解决方案2】:

      您可以使用以下方式调用动态属性和方法:

       $this->{$page}();
      

      【讨论】:

        【解决方案3】:

        使用类。

        Class URLMethods {
          public function home(){ ... }
          public function about(){ ... }
        }
        
        $requestedPage = $_GET['page'];
        
        $foo = new URLMethods();
        $foo->$requestedPage();
        

        【讨论】:

        • 但由于安全等原因,允许 url 变量控制流是一个糟糕的主意。如果您打算这样做,请确保您清理(明确检查允许值)GET 变量。
        【解决方案4】:

        您可以使用call_user_func 来实现此目的。另见How do I dynamically invoke a class method in PHP?

        我认为您还想将另一个字符串附加到这样的可调用函数中:

        public function homeAction(){}
        

        为了防止黑客调用您可能不想使用的方法。

        【讨论】:

        • 为什么不把这些方法设为私有?
        • 以防万一您需要从另一个类调用该方法。无论如何,您的评论问题是主观的,这就是 ZendFramework 的实际做法,所以我认为这样做确实有一些逻辑。
        • 默默无闻的安全性并不重要
        • 您的评论毫无意义,毫无根据。我至少提出了一些论据。
        猜你喜欢
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 2013-07-01
        相关资源
        最近更新 更多