在不使用框架的情况下,干净地构建PHP站点的最佳方法是什么?

在不使用框架的情况下,干净地构建PHP站点的最佳方法是什么?,php,design-patterns,Php,Design Patterns,我在一个中型PHP网站上工作。我正在为我的对象编写“提供者”类。基本上,如果我有一个“user”对象,我就有一个“user provider”类,它可以请求/保存数据库中的用户,接受并返回用户对象。我只是在需要的文件中包含提供者和依赖对象 我想知道这是否是一种在没有框架的情况下构建PHP站点的干净方法,因此我很想听听其他人的意见,不使用框架构建PHP站点的最佳方法是什么。这是一个很好的起点: 但基本上你最终得到的是。。。是一个框架:)首先,使用框架没有错,只要它不会给小型应用程序带来不必要的复杂

我在一个中型PHP网站上工作。我正在为我的对象编写“提供者”类。基本上,如果我有一个“user”对象,我就有一个“user provider”类,它可以请求/保存数据库中的用户,接受并返回用户对象。我只是在需要的文件中包含提供者和依赖对象


我想知道这是否是一种在没有框架的情况下构建PHP站点的干净方法,因此我很想听听其他人的意见,不使用框架构建PHP站点的最佳方法是什么。

这是一个很好的起点:


但基本上你最终得到的是。。。是一个框架:)

首先,使用框架没有错,只要它不会给小型应用程序带来不必要的复杂性和/或性能损失。在PHP中,Symfony和Laravel框架在这方面非常好

话虽如此,如果你真的不想要一个“外来”的框架,你最终还是会编写自己的框架。因此,最好对此进行规划。只需使用您最喜欢的框架,按照使用该框架时的方式构建您的项目。然后,自己编写粘合代码(即您自己的迷你框架)。如果您注意到您的项目比预期的要大,那么切换到“真正的”框架不会有太多困难


然而,如果您真的不想使用任何类似于框架的东西,因为您的应用程序非常小,只需将所有内容放在一个文件中即可。在该文件中,您当然应该在表示、CSS、应用程序逻辑等之间保持干净的分离。!但是在一个最小的应用程序中,不需要陷入多个文件的麻烦。

模型视图控制器也很好

以下建议在许多经验丰富的PHP开发人员中形成共识:

  • myproject/
    • 应用程序/
      • configs/
      • 控制器/
      • 视图/
      • models/
    • library/
      • PEAR/
      • Zend/
    • public/
      ← 文档根
      • index.php
      • library/
        • editarea/
        • jquery/
        • OpenLayers/
      • media/
      • style/
        • default.css
尽管这种结构最初是在Zend框架中创造的,但它对于任何项目都是可取的,无论它使用哪种框架,或者它是否使用框架

从一开始就采用这种结构,当应用程序增长时,您将能够轻松地切换到真正的框架

有关此结构的一些重要注意事项:

  • 文档根目录是一个名为
    public/
    的直接子文件夹,不仅在PHP中是一个公认的标准,在Python、Ruby等语言中也是如此
  • 文件夹名称与技术无关。(
    library/
    而不是
    js/
    style/
    而不是
    css/
  • 这个结构还需要一些讨论。例如,如果目录的名称都是单数或复数,而不是像
    library
    styles
    这样的混合,那就更好了。此外,有人可能会认为MVC并不总是可取的,或者不应该这样命名,因此更通用的文件夹名称,如
    templates/
    ,而不是
    views/
    ,会是更好的选择

为什么不使用框架呢?我认为这个项目可能太小了,不需要框架。也许没有一个项目那么小?如果项目变成了实质性的东西,那么你可能不得不移植到一个框架。“只要确保你没有重新发明轮子就行了。”KenStruys这些天你的评论让我笑了,考虑到Taylor Otwell最终创建了Laravel框架,哈哈哈。这在大项目上是否更可取,更不用说小项目了,这是有争议的。在最近的框架中,相反的策略“按约定配置”已被证明更为成功,而不是为每种字符串连接定义单独的配置变量。:-)是的,我完全同意。。约定优先于配置(和MVC)是现在真正需要做的事情。虽然对于在线应用程序来说,即使使用ridig MVC框架也是有争议的,但imo。但是OP不想使用框架,因此在这种情况下,以这种或那种方式做事确实是他的特权。事实上,但对于一个简单的项目,CoC更为可取,所以推荐5个不需要的配置变量对我来说有点奇怪。任何简单的解决方案都可以,只要您使用
dirname(\uuu FILE\uu)
,并且不要硬编码绝对路径。Boo用于使用全局变量(如果路径是超全局的,可以。但它看起来像是来自约定的,但不是)。。。为什么不使用常量(考虑到这些路径应该在运行时更改)?阅读Laravel对Laravel创建者的建议是很奇怪的,这就是它的起点。哇!
$_PATHS["base"]      = dirname(dirname(__FILE__)) . "/";
$_PATHS["includes"]  = $_PATHS["base"] . "includes/";
$_PATHS["templates"] = $_PATHS["base"] . "templates/";
$_PATHS["pear"]      = $_PATHS["base"] . "pear/";
$_PATHS["logs"]      = $_PATHS["base"] . "logs/";