PHP的引用类的定义问题

ShawnGung 2016-10-22 08:12:19
<?php
//index.php
require_once 'Frame.class.php';
//require_once 'Model.class.php';
//require_once "./BaseController.class.php";
Frame::run();
?>


<?php
//frame.class.php
//require_once "./BaseController.class.php";
require_once "Controller.class.php";
//require_once 'Model.class.php';
class Frame{
public static function run(){
$controller = new Controller();
}
/
}


<?php
//controller.class.php
require_once "BaseController.class.php";
require_once 'Model.class.php';
class Controller extends BaseController{
public function __construct(){
echo "new controller";
//parent::__construct();
//echo "new controller<br/>";
$model = new Model();
}
public function index(){
}
}


我这里想问的是关于BaseController和Model的类的声明的引入.
Model的引入,不管在index.php,还是fram.class.php还是在controller.class.php中都是可以的
问题一:为什么basecontroller的引入写在index.php却不行,而model却可以
问题二:正常道理来说basecontroller的定义应该在controller.class.php中引入才比较好理解,为什么可以再前面中引入也同样可以呢?究竟引入之后,PHP底层是怎么处理导致这样的不同后果呢?
这是我在写我的MVC框架时候发现的问题.希望得到大家的帮助!!!

...全文
1108 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShawnGung 2016-10-28
  • 打赏
  • 举报
回复
引用 9楼zlongxielinhua 的回复:
文件加载顺序出错了Controller类继承于BaseController类,则BaseController文件需要优先于Controller文件进行加载。而你先加载frame.class.php时,该文件中有代码require_once "Controller.class.php" 则会进入加载Controll.class.php文件。这个时候BaseController.class.php文件并没有加载,而Controlle.class.php又继承于BaseContoller,当然就会发生文件找不到的问题了。 解决方案是:你的frame.class.php文件必须在BaseController.class.php文件之后require进来 你这个代码的加载流程应该是这样的: 1、加载BaseController.class.php (必须在Controller.class.php之前加载) 2、加载其他php文件 php执行顺序(include和require) php文件中不包含include (1)进行function的定义 (2)从上到下执行php脚本 php文件中包含include (1)进行当前文件中的function定义 (2)从上到下执行当前文件 (3)执行到include后,去加载文件 (4)进行加载文件中的function定义, (5)执行加载文件 (6)加载文件执行完后,回到include之后继续执行
谢谢你。明白了
ShawnGung 2016-10-28
  • 打赏
  • 举报
回复
引用 8楼xuzuning 的回复:
<?php //index.php require_once 'Frame.class.php'; //require_once 'Model.class.php'; require_once "./BaseController.class.php"; 你这样当然不行 Frame::run(); ?> 要这样 <?php //index.php require_once "./BaseController.class.php"; require_once 'Frame.class.php'; //require_once 'Model.class.php'; Frame::run(); ?>
就是加载的顺序也要符合逻辑对吗?
zlongxielinhua 2016-10-25
  • 打赏
  • 举报
回复
文件加载顺序出错了Controller类继承于BaseController类,则BaseController文件需要优先于Controller文件进行加载。而你先加载frame.class.php时,该文件中有代码require_once "Controller.class.php" 则会进入加载Controll.class.php文件。这个时候BaseController.class.php文件并没有加载,而Controlle.class.php又继承于BaseContoller,当然就会发生文件找不到的问题了。 解决方案是:你的frame.class.php文件必须在BaseController.class.php文件之后require进来 你这个代码的加载流程应该是这样的: 1、加载BaseController.class.php (必须在Controller.class.php之前加载) 2、加载其他php文件 php执行顺序(include和require) php文件中不包含include (1)进行function的定义 (2)从上到下执行php脚本 php文件中包含include (1)进行当前文件中的function定义 (2)从上到下执行当前文件 (3)执行到include后,去加载文件 (4)进行加载文件中的function定义, (5)执行加载文件 (6)加载文件执行完后,回到include之后继续执行
xuzuning 2016-10-25
  • 打赏
  • 举报
回复
<?php //index.php require_once 'Frame.class.php'; //require_once 'Model.class.php'; require_once "./BaseController.class.php"; 你这样当然不行 Frame::run(); ?> 要这样 <?php //index.php require_once "./BaseController.class.php"; require_once 'Frame.class.php'; //require_once 'Model.class.php'; Frame::run(); ?>
ShawnGung 2016-10-25
  • 打赏
  • 举报
回复
引用 6楼xuzuning 的回复:
class Controller extends BaseController{ 类 Controller 继承了 BaseController 所以 BaseController.class.php 要在 controller.class.php 之前加载 你在 //frame.class.php 中 只加载了 Controller.class.php 而未加载 BaseController.class.php 自然是不行的 说 正常道理来说basecontroller的定义应该在controller.class.php中引入 当然是可以的,但也有些霸道了 至于 Model,你没有给出相关代码,不好说 其实,为了避免到处都是 require_once ,宜在入口处就将 MVC 三个成员的基类加载进来
可是我basecontroller只在index.php加载、其他文件都不加载basecontroller时候就会出现问题。
xuzuning 2016-10-25
  • 打赏
  • 举报
回复
class Controller extends BaseController{ 类 Controller 继承了 BaseController 所以 BaseController.class.php 要在 controller.class.php 之前加载 你在 //frame.class.php 中 只加载了 Controller.class.php 而未加载 BaseController.class.php 自然是不行的 说 正常道理来说basecontroller的定义应该在controller.class.php中引入 当然是可以的,但也有些霸道了 至于 Model,你没有给出相关代码,不好说 其实,为了避免到处都是 require_once ,宜在入口处就将 MVC 三个成员的基类加载进来
ShawnGung 2016-10-25
  • 打赏
  • 举报
回复
引用 1楼xuzuning 的回复:
你只贴代码,不给文件名。谁知道谁是谁? 定义在前,使用在后。这是基本原则
我的注释有文件名。能帮解决下疑惑吗?百度不出来
ShawnGung 2016-10-25
  • 打赏
  • 举报
回复
引用 3楼果酱很好吃 的回复:
1、因为在index.php中,你先引入了Frame.class.php,它依赖于BaseController.class.php,所以要先引入BaseController.class.php,而 Model.class.php 是你在调用的时候才会使用到,所以在 Frame::run(); 的时候,它已经引入了 2、在controller.class.php 中引入 basecontroller是合理的,php是顺序执行的,运行的时候,就相当于把这几个页面都引入到一个页面执行
没听太懂。按你第二点说的。那我都在index.php引入不行吗?
果酱很好吃 2016-10-24
  • 打赏
  • 举报
回复
1、因为在index.php中,你先引入了Frame.class.php,它依赖于BaseController.class.php,所以要先引入BaseController.class.php,而 Model.class.php 是你在调用的时候才会使用到,所以在 Frame::run(); 的时候,它已经引入了 2、在controller.class.php 中引入 basecontroller是合理的,php是顺序执行的,运行的时候,就相当于把这几个页面都引入到一个页面执行
ShawnGung 2016-10-23
  • 打赏
  • 举报
回复
注释里面有文件名了.
xuzuning 2016-10-22
  • 打赏
  • 举报
回复
你只贴代码,不给文件名。谁知道谁是谁? 定义在前,使用在后。这是基本原则

4,251

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧