【问题标题】:Can anyone suggest how to use OOP in PHP based on URL? [closed]谁能建议如何基于 URL 在 PHP 中使用 OOP? [关闭]
【发布时间】:2014-03-01 00:29:01
【问题描述】:

我厌倦了基于页面和所有内容制作脚本。我不想用旧的方式做事。我想学习基于 url 的 OOP。我知道如何使用 .htacces 进行 url 屏蔽和重写规则。但问题是,当我将所有查询转发到 PHP 页面时,我必须使用 switch case 语句来包含文件。就像查询是 p=profile 那么我需要手动或按函数包含 profile.php 文件。但我不想做这种事情。我想学习专业的 PHP,这样我就可以创建诸如 wordpress 和 elgg 之类的 web 应用程序。我已经尝试查找有关它的在线教程,但它对我不起作用。

我希望至少有一个人能帮助我正确的方法。

【问题讨论】:

  • 好问题。可能是你在自学。
  • 是的。我正在自学。使用在线教程。
  • 谷歌“MVC PHP”和“RESTful API”——如果你想学习如何做(并且知道要寻找什么),这里有很多解释和教程。
  • 哦,谢谢@CD001。我得到了一些关于它的教程。感谢所有帮助过我的人。 :D

标签: php .htaccess oop url url-masking


【解决方案1】:

有很多方法可以做到这一点。它的要点是,在命名控制器及其方法时使用约定。使用 URL 重写将所有请求映射到单个请求调度程序,然后在该类中进行逻辑以加载适当的资源(如您所述)。但是不要使用巨大的switch,而是这样做:

  1. 请求的 URL:http://my.host.com/blog/hello-world
  2. 将 URL 重写为:dispatcher.php?q=blog/hello-world
  3. 在调度程序中,解析q 并考虑: a) 类controllers/Blog.php 存在吗?如果是这样实例化 b) 类博客有helloWorld 方法吗?如果是,请调用它

这是一个脑残的例子,但也许它会让你开始。

我的建议:不要重新发明轮子。使用 Laravel 或 Yii 或 _ 之类的高质量框架(在此处插入最喜欢的框架)。这将为您节省大量时间。但如果您想或必须从头开始编写,请考虑下载这样的框架并通过示例学习。

【讨论】:

    【解决方案2】:

    通常,url中的参数用于调用各自的class/function。假设我们有这些网址:

    • example.com/index.php?控制器=foo
    • example.com/index.php?控制器=foo&函数=编辑
    • example.com/index.php?控制器=

    index.php,您可以开始使用以下内容:

    $controller = $_GET["controller"];
    include("controllers/{$controller}");
    $theClass = new $controller();
    

    某些 Web 应用程序使用“默认功能”,该功能在 url 中未指定功能时触发。例如,index 函数:

    $function = $_GET["function"];
    if (empty($function))
        $function = "index";  // the default function to be called
    
    $theClass->$function();
    

    Foo 类可以如下所示:

    class Foo{
    
        function index(){
            echo "hello index";
        }
    
    
        function edit(){
            echo "editing foo";
        }
    
    }
    
    • 对于 url example.com/index.php?controller=foo,输出将是 hello index
    • 对于 url example.com/index.php?controller=foo&function=edit,输出将是 editting foo

    注意: 您可以使用$_SERVER['QUERY_STRING'] 代替$_GET 使网址更加“友好”。

    【讨论】:

    • 这容易受到 LFI 的攻击
    • 这只是开始的基本逻辑。不适用于生产环境
    • 是的,我只是觉得这很重要。
    【解决方案3】:

    怎么样:

    <?php
    
    if(!isset($_GET['page'])){$_GET['page'] = 'index';}
    $whiteList = array('index', 'page1', 'page2');
    
    $controller = in_array($_GET['page'], $whiteList) ? $_GET['page'] : 'index';
    
    $controller = new $controller();
    $controller::indexAction();
    
    ?>
    

    编辑:添加了对控制器的调用。

    【讨论】:

    • OOP 怎么样?并且 $whiteList 或多或少是 op 试图避免的确切 switch 语句。这就是我们在 90 年代的做法! ;)
    • 这比 switch case 语句更容易,但与它们类似。我所说的就像使用专业网站和应用程序。 facebook、google、yahoo、stakeoverflow 等网站和 wordpress、elgg、joomla 等应用程序。我在他们的剧本中没有找到类似的东西。
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2019-02-22
    相关资源
    最近更新 更多