我正在研究一个相当简单的OO PHP框架(在这种情况下我认为并不重要......),具有以下基本结构:
application/
classes/
controllers/
includes/
models/
views/
classes/
includes/
Run Code Online (Sandbox Code Playgroud)
我知道使用接口而不是硬编码类是OOP的好习惯,但我不确定当涉及到接口目录和文件的实际位置/结构时,最佳做法是什么.
接口是否应分成目录下的多个文件:
interfaces/
iDatabase.php
iRouter.php
Run Code Online (Sandbox Code Playgroud)
或者它们都应该放在一个文件中,因为它们不是那么大:
includes/
interfaces.php (with all Interfaces inside)
Run Code Online (Sandbox Code Playgroud)
使用第一个选项,我可以使用自动加载器来加载接口,而不是在不是所有文件都可以使用时加载每个文件,而使用第二个选项它们最初都会加载,但这样可以节省我每次加载多个文件的时间.
你的想法是什么?我是否完全以错误的方式看待这个问题(我倾向于用我的大部分问题做到这一点,直到有人引导我朝着正确的方向前进!哈哈)
谢谢堆!
瑞安
编辑2011-02-07:
看完我到目前为止给出的答案后,我尝试了一些事情.
假设下面的类从磁盘上的确切位置自动加载(Database_Database将加载到'classes/Database/Database.php'中),这个设置是否有效?
class Database_Mysql_Database extends Database_DatabaseAbstract implements Database_Database {}
Run Code Online (Sandbox Code Playgroud)
Database_Mysql_Database是一个普通类,Database_DatabaseAbstract是一个抽象类,具有不同类型数据库通用的基本方法,Database_Database将是用户键入的接口,以确保与其类的兼容性.
我是在正确的轨道上吗?
我目前正在开发自己的PHP框架,我需要一些帮助来确定我是否正朝着正确的方向前进......
该框架既可供我自己使用,也可以进一步提升我的PHP技能.我遇到了很多问题,通过克服它们,我学到了很多东西,并且喜欢能够从零开始创造一些东西,所以我宁愿看不到像"Just use Zend"这样的答案!;)
我已经阅读了Stack Overflow和其他一些网站上的一些文章,但是我无法得到我需要的正确答案,所以希望有人可以给我一些有用的建议!
我已经尝试了一些不同的解决方案,但我最终让自己感到困惑,我不确定现在要走哪条路!我不能完全理解这一切......
'理论'框架结构
- .htaccess
- index.php
- private/
- app/
- bootstrap.php
- modules/
- default/
- controllers/
- pages.php
- index.php
- models/
- views/
- admin/
- controllers/
- models/
- views/
- config/
- config.php
- autoloader.php
- lib/
- Some_Library
- Class1
- class1.php
- Class2
- class2.php
- public/
- css
- images
- scripts
Run Code Online (Sandbox Code Playgroud)
细节
嘿伙计们,这里只是一个小问题..(希望如此!)
我一直在为PHP MVC框架尝试一堆不同的目录结构.在这样做时,我想到了将应用程序的不同部分彼此分开的几个原因.
例如,假设这是我目前的结构:
- index.php
- private/
- application/
- ... (MVC stuff. Irrelevant I think...)
- config/
- config.php
- framework/
- bootstrap.php
- includes/
- library/
- ... (Framework classes)
- libraries/
- Zend/
- PEAR/
- public/
- css/
- images/
Run Code Online (Sandbox Code Playgroud)
我拥有它的方式,我可以简单地通过覆盖/ private/framework /目录来更新框架,这不会影响/ private/config /中的用户框架配置,也不会影响/ private/libraries /中的第三方库.
该的index.php文件用于几乎完全加载/private/framework/bootstrap.php文件,这将意味着在更新/私营/框架/目录也将有更新更新主引导文件(救了我/ index.php文件,它将保持原样,因为它根本没有多少).
此外,应用程序也与框架的所有内容分开,因此用户可以在需要时切换/更改/更新其应用程序,而无需担心其他目录.
我是否在正确的轨道上关于将目录彼此分离以使它们更容易更新?
我在一些框架中看到他们在他们的框架目录中都有他们的/ private/libraries /和/ private/application /目录......但是在我看来这很难更新到更新版本的框架如果需要的话.或者我是否以错误的方式思考它?
如果您有兴趣,可以在 …
php model-view-controller directory-structure separation-of-concerns
对于依赖注入,我理解我必须将一个类的实例传递给主实例而不是主类创建它自己的实例,就像这样(php):
class Class_One {
protected $_other;
public function setOtherClass( An_Interface $other_class ) {
$this->_other_class = $other_class;
}
public function doWhateverYouHaveToDoWithTheOtherClass() {
$this->_other_class->doYourThing();
}
}
interface An_Interface {
public function doYourThing();
}
class Class_Two implements An_Interface {
public function doYourThing() { }
}
class Class_Three implements An_Interface {
public function doYourThing() { }
}
// Implementation:
$class_one = new Class_One();
$class_two = new Class_Two();
$class_three = new Class_Three();
$class_one->setOtherClass( $class_two );
$class_one->doWhateverYouHaveToDoWithTheOtherClass();
$class_one->setOtherClass( $class_three );
$class_one->doWhateverYouHaveToDoWithTheOtherClass();
Run Code Online (Sandbox Code Playgroud)
这一切都很好.我知道,由于Class_Two和Class_Three都实现了An_Interface,因此它们可以在Class_One中互换使用.Class_One不会知道它们之间的区别.
我的问题是,不是将实例传递给setOtherClass,而是传递一个字符串,如"Class_Two",并让Class_One的setOtherClass方法实际创建实例本身,这是一个好主意:
class Class_One { …Run Code Online (Sandbox Code Playgroud) 我正在创建一个PHP Web应用程序框架(MVC)。我宁愿不使用外部库或组件(因为我现在希望这纯粹是我的工作)
您能否告诉我一些有关我的每个文件应负责做什么的提示/指南?例如,框架脚本应处理什么,框架中使用的应用程序脚本应处理什么?
我一直在更改编写不同代码的位置(就像我自己想的那样……“应该由框架还是由每个应用程序来处理?”),这使我在编写过程中更加困惑。
我已经读了一堆(甚至20 ... 50 ... 100!)有关MVC,框架等的教程,但是没有太多的文章可以解释框架的理想“流程”。
目前,我有这样的工作:
现在...我似乎正朝着正确的方向前进?框架的Main Index脚本而不是App Index应该做什么?Main索引是否应该只是启动一些东西并将大部分工作传递给App索引,App索引将设置路由器等以将URL路由到控制器等?还是框架应该创建路由器并启动控制器,而App只需设置控制器路径和一些规则等?
我了解Controller的功能以及模型/视图等(稍后我会穿过那些桥梁),但是现在我只想让基本的东西从正确的地方正确地流动,所以以后的东西会起作用好。
此刻,我的头快要爆炸了!哈哈
这甚至可能是一个非常愚蠢的问题,但是我只是想在我完全摆脱一切之前,需要一些直接的指导来帮助我清除所有问题!任何意见,将不胜感激。
谢谢=)