佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1036|回复: 23

[PHP][MVC]吐血帖

[复制链接]
发表于 24-4-2007 05:56 PM | 显示全部楼层 |阅读模式
qi因为正在自学MVC,写程序的时候有点confused
我想confirm passing by reference是不是这样的状况

比如说以下的code
……
另外,MVC一定要把工作分得很清楚吗?我快要乱死了,而且因为没有ide在手上,所以追踪起来真得很想死……

[ 本帖最后由 V4ndrake 于 11-5-2007 07:20 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 24-4-2007 08:53 PM | 显示全部楼层
PHP5已经将assignment调整成自动Reference了,而不是像PHP4复制一个object;

不再是:

$foo = &$bar;

而是:

$foo = $bar;

你的例子有点模糊,可以再清楚一点吗?
回复

使用道具 举报

 楼主| 发表于 24-4-2007 10:01 PM | 显示全部楼层
原帖由 苦瓜汤 于 24-4-2007 08:53 PM 发表
PHP5已经将assignment调整成自动Reference了,而不是像PHP4复制一个object;

不再是:

$foo = &$bar;

而是:

$foo = $bar;

你的例子有点模糊,可以再清楚一点吗?


我在实习中涅,而且该server已经在host着一些别的script了,我不想要求去更换php5
PHP5已经有了我知道,可是我还是在php4下工作
我正在慢慢picking up MVC,也已经开始慢慢implement,只是没有人指点,怕自己画虎不成反类犬
暂时出来的skeleton应该是这样的 http://www.coolsilon.com/intern.zip ,你会有时间帮忙看吗?
不过我的final year project也是要用到php5+mysql5,在找着廉价又稳定的空间中
回复

使用道具 举报

发表于 25-4-2007 09:40 AM | 显示全部楼层
原帖由 苦瓜汤 于 24th Apr, 2007 20:53 发表
PHP5已经将assignment调整成自动Reference了,而不是像PHP4复制一个object;

不再是:

$foo = &$bar;

而是:

$foo = $bar;

你的例子有点模糊,可以再清楚一点吗?


若我沒記錯的話,PHP5並沒有如您所說的pass-by-reference,請看下例:
$user1 = "Danny";
$user2 = $user1;
print "User 1 is " . $user1 . "<br>";
print "User 2 is " . $user2 . "<br>";

print "<br>User 1 is changing name...<br>";
$user1 = "Eric";
print "User 1 is " . $user1 . "<br>";
print "User 2 is " . $user2 . "<br>";


其結果為:
User 1 is Danny
User 2 is Danny

User 1 is changing name...
User 1 is Eric
User 2 is Danny


若在第二行的等於之後加入"&",如下:
$user1 = "Danny";
$user2 =& $user1;
print "User 1 is " . $user1 . "<br>";
print "User 2 is " . $user2 . "<br>";

print "<br>User 1 is changing name...<br>";
$user1 = "Eric";
print "User 1 is " . $user1 . "<br>";
print "User 2 is " . $user2 . "<br>";


其結果為:
User 1 is Danny
User 2 is Danny

User 1 is changing name...
User 1 is Eric
User 2 is Eric



不曉得之前有在哪裡讀過一編文章,它是說當在instantiate新物件時,PHP5會自動用pass-by-reference(PHP4不會)。如下:
$user = new User("Danny");

[ 本帖最后由 itplanet 于 25-4-2007 09:48 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 25-4-2007 09:48 AM | 显示全部楼层
原帖由 itplanet 于 25-4-2007 09:40 AM 发表


若我沒記錯的話,PHP5並沒有如您所說的pass-by-reference,請看下例:


其結果為:


不曉得之前有在哪裡讀過一編文章,它是說當在instantiate新物件時,PHP5會自動用pass-by-reference(PHP4不會) ...


我想他举的例子应该是$foo & $bar都是object吧
回复

使用道具 举报

发表于 25-4-2007 10:23 AM | 显示全部楼层
原帖由 V4ndrake 于 25th Apr, 2007 09:48 发表


我想他举的例子应该是$foo & $bar都是object吧


哦!若是物件的話就會pass-by-reference,沒錯!
class User {
  private $name;
  
  public function __construct( $name ) {
    $this->name =& $name;
  }
  
  public function setName( $name ) {
    $this->name =& $name;
  }
  public function getName() {
    return $this->name;
  }
}

$user1 = new User("Danny");
$user2 = $user1;
print "User 1 is " . $user1->getName() . "<br>";
print "User 2 is " . $user2->getName() . "<br>";
print "User 1 is changing name...<br>";
$user1->setName( "Eric" );
print "User 1 is " . $user1->getName() . "<br>";
print "User 2 is " . $user2->getName() . "<br>";


其結果為:
User 1 is Danny
User 2 is Danny
User 1 is changing name...
User 1 is Eric
User 2 is Eric
回复

使用道具 举报

Follow Us
发表于 25-4-2007 10:37 AM | 显示全部楼层
原帖由 itplanet 于 25-4-2007 09:40 AM 发表


若我沒記錯的話,PHP5並沒有如您所說的pass-by-reference,請看下例:


其結果為:


若在第二行的等於之後加入"&",如下:


其結果為:



不曉得之前有在哪裡讀過一編文章, ...

要弄清楚Value Type和Reference Type。试试看一下例子:

  1. class User {
  2.     private $name;

  3.     function __construct($name){
  4.         $this->name = $name;
  5.     }
  6.     public function set_name($name){
  7.         $this->name = $name;
  8.     }
  9.     public function sayHello(){
  10.         echo "Hello, my name is ".$this->name."\n";
  11.     }
  12. }

  13. $user1 = new User("Eric");
  14. $user2 = $user1;

  15. echo "Testing say hello...\n";
  16. $user1->sayHello();
  17. $user2->sayHello();

  18. echo "Change name to Danny...\n";
  19. $user2->set_name("Danny");
  20. $user1->sayHello();
  21. $user2->sayHello();
复制代码
回复

使用道具 举报

发表于 25-4-2007 10:40 AM | 显示全部楼层
原帖由 itplanet 于 25-4-2007 10:23 AM 发表


哦!若是物件的話就會pass-by-reference,沒錯!


其結果為:

啊,比我快,哈哈
回复

使用道具 举报


ADVERTISEMENT

发表于 25-4-2007 10:55 AM | 显示全部楼层
原帖由 V4ndrake 于 24-4-2007 10:01 PM 发表


我在实习中涅,而且该server已经在host着一些别的script了,我不想要求去更换php5
PHP5已经有了我知道,可是我还是在php4下工作
我正在慢慢picking up MVC,也已经开始慢慢implement,只是没有人指点,怕 ...

大概看了原码,我觉得可以的话把Request提升成一个class。把所有的request path, post/get, cookies等全部封装起来。
回复

使用道具 举报

 楼主| 发表于 25-4-2007 02:57 PM | 显示全部楼层
原帖由 苦瓜汤 于 25-4-2007 10:55 AM 发表

大概看了原码,我觉得可以的话把Request提升成一个class。把所有的request path, post/get, cookies等全部封装起来。


encapsulation = 封装?

怎么说呢?就是全部都丢进去request class里面?然后request class的constructor(建构子?)?

instantiate object(物件)的时候先对input作一些处理(addslashes?),然后再丢给controller?

问题是……我不懂我的MVC structure对不对。而且我想避免pass by reference,因为我到现在还不懂为什么我的pass by reference不对……(AddIncidentController那一个file)

快疯了……
回复

使用道具 举报

 楼主| 发表于 25-4-2007 03:02 PM | 显示全部楼层
原帖由 itplanet 于 25-4-2007 10:23 AM 发表


哦!若是物件的話就會pass-by-reference,沒錯!


其結果為:


我要哭了,我也知道php5有
但是我目前实习公司用的是php4
因为他们同时在同一个server有run着一些script不晓得是不是php5 compliant所以我才用php4写的
可是目前php4没有passing by reference涅
而且因为MVC的每一个component的工作分得很清楚,所以我不敢随便把次序掉乱(虽然我也不懂我自己的implementation/understanding对不对)。我也想找我的同事问问,但是他们都是做server/pc maintenance的,就算会programming也只有perl……
回复

使用道具 举报

 楼主| 发表于 26-4-2007 04:45 PM | 显示全部楼层
什么人来救我?
回复

使用道具 举报

 楼主| 发表于 3-5-2007 05:35 PM | 显示全部楼层
暂时修改了整个flow,变成是view去把资料向model要回来(pull)

发觉MVC很难100%去跟,不然的话,从coding一直追踪flow会吐血(从front-controller飞到controller然后飞到view然后再飞到model,结果我晕飞机)

现在很多事情都在controller发生了,就是所有的function call都在controller发生,基本上整个flow都在controller,其实应该在model的吧?!

然后如果每一面都要加上header/footer的话,应该由什么人(model, view/controller)去call出来?!

明天就要把整个program连接去database了,希望不会有状况。
回复

使用道具 举报

发表于 3-5-2007 11:25 PM | 显示全部楼层
如果使用 JSP, 非常简单.

http://localhost/View.jsp?id=UserDetail


View.jsp (front-controller)

<%
  String viewClass = request.getParameter("id " ) + "View " ; // e.g. UserDetailView.java
  ViewObject viewObject = ViewFactory.CreateObject(viewClass) ;
  viewObject.processView(request, response);
%>

<html>
<title>My Title</title>
<body>

HEADER

<%
  pageContext.include(request.getParameter("id " + "View.jsp " ); // e.g UserDetailView.jsp
%>
  
FOOTER

</body>
</html>


UserDetailView.java (extends ViewObject) View-Controller Class

  public void processView (HttpServletRequest request, HttpServletResponse response)
  {
    //retrieve from database or from Model Class
    request.setAttribute("UserName", "Mr. Test " );
    request.setAttribute("DateOfBirth", "01-01-2004");
  }


UserDetailView.jsp View

UserName : ${UserName}   //Using JSTL
Date Of Birth : ${DateOfBirth}

or

UserName : <%=request.getAttribute("UserName" ) %>
Date Of Birth : <%=request.getAttribute("DateOfBirth " ) %>

[ 本帖最后由 hkloke2000 于 3-5-2007 11:29 PM 编辑 ]
回复

使用道具 举报

发表于 4-5-2007 09:13 AM | 显示全部楼层

回复 #13 V4ndrake 的帖子

了解了MVC後,不一定要跟足,只要你的框架有發揮MVC的精神就可以了。開始製作這個框架也許比較費功夫,但只要你成功將它穩定(stabilize)了後,你就會發覺它的可愛了。

Header和Footer是甚麼性質的東西呢?我的思考方式如下:它會控制程式流程(control flow)嗎?它有商業程序(business process)嗎?個人認為它沒有以上兩種性質,所以它是那一個部分呢?我會將它歸類為介面(View)的部份。

[ 本帖最后由 itplanet 于 4-5-2007 09:14 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 4-5-2007 12:32 PM | 显示全部楼层
原帖由 itplanet 于 4-5-2007 09:13 AM 发表
了解了MVC後,不一定要跟足,只要你的框架有發揮MVC的精神就可以了。開始製作這個框架也許比較費功夫,但只要你成功將它穩定(stabilize)了後,你就會發覺它的可愛了。

Header和Footer是甚麼性質 ...


哦,嘿嘿,我指的header / footer是 view的,所以应该是在view super class叫出来呱
楼上的楼上好像有解答了,谢谢
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 5-5-2007 11:15 AM | 显示全部楼层
突然发觉到如果没有很好的规划的话,做MVC简直就是找死……好像我现在实习的project想到什么就做什么。虽然一直在掌控那个structure,但是好象越做越难maintain那个structure,尤其是message passing的那部分。

看来在规划我的FYP要把我的经验全部丢进去改善,不然的话FYP的structure比我的实习大上好几倍,等下做到真的吐血。虽然sequence diagram画上来很麻烦,但是不画真的不行……

目前我的flow如下

front controller把request redirect去适当的page controller

然后page controller就control整个program flow,适当时候把适当的methods从model和view弄出来(是为了避免message passing要进到很多层)

models只是很纯粹包含business rules和一些简单的flow/processes,然后资料全部丢到相关entity classes里面(因为不想要logic跟data混淆在一起)。之后database connection从model 呼叫data access object去跟进,又少了一大堆没有关联的database storing/retrieval flow。

view应该从model拿content,然后model再从entity classes(比如说validation不过,或者entity已经透过model拿到database的资料了)拿content(这是我要做到的,目前我是直接跳过model直接跟entity拿content)。

……

不知道上面还有没有符合MVC的要求涅?我觉得有,但是不是完全的。
无怪研究报告指出OO比procedural 慢,要经过那么多层的message passing,蚊子都死啦……
而且……我发觉,我还只是完成了一个module的其中一个view大概60%左右,已经弄了……20个档案……天啊,那我的final year project不是要好几十个file?酱大个仔第一次做这么复杂的东西。
回复

使用道具 举报

发表于 6-5-2007 07:55 AM | 显示全部楼层
原帖由 V4ndrake 于 5-5-2007 11:15 AM 发表
突然发觉到如果没有很好的规划的话,做MVC简直就是找死……好像我现在实习的project想到什么就做什么。虽然一直在掌控那个structure,但是好象越做越难maintain那个structure,尤其是message passing的那部分。 ...

与其凭空摸索,为何不参考现有的开源MVC框架原码呢? 看一看别人是怎么实现MVC框架和从原码中学习他们的经验,总比好过完全靠技术文章来所传达的概念来实践。
回复

使用道具 举报

 楼主| 发表于 6-5-2007 05:11 PM | 显示全部楼层
可是我的internship时间剩下不多(还有两三个星期罢了),我没有信心能够在这么短的时间内掌握的喔……除非我是为我的final year project准备

我的supervisor又追进度追到很紧,明明知道我不是experienced的,然后又是一个人做的……唉……很大压力涅
回复

使用道具 举报

发表于 6-5-2007 05:21 PM | 显示全部楼层

回复 #19 V4ndrake 的帖子

我同意苦果的提议,自己摸索可能更耗时
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 4-9-2025 11:54 AM , Processed in 0.160262 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表