断断续续,写啊写,从最简单的留言本(HTML和PHP完全混得一塌糊涂)到现在,差不多已经有两三年了。
可是现在感觉越写越倒退了,快无从下手了。原先的积累了一些小代码,后来改了discuz和uchome之后就发现自己原先的那些积累的代码太不行了,准备写个新的,但是现在发现无法手下了。对于PHP,比如index.php,必定是数据库最新或者最热的内容的列表,是用类来调用好还是直接将获取代码写在index.php里面好。
不知道大家明白了我的意思没discuz的是直接将sql语句和获取代码直接写在该前台文件里面。比如viewthread.php index.php。
大家是怎么样做的?
真的对PHP无从下手了,有点恐怖啊,还要用这个来吃饭nie。如果用对象来弄的话,我想过了就是每个表对应一个对象,我是这样的,但是这样假如表非常多的话,80多个100多个的话,那得建上百个class.php文件了。用哪种方法好?不过还是觉得将获取数据库内容的代码和处理的代码直接写在前台文件好一些,但是如果其他前台文件要用这个的话,又必须再写一次,很不便管理。大家有什么好的方法和建议。
(写得有点乱,希望大家可以看得懂。)

解决方案 »

  1.   

    无从下手,那就用framework吧。CI不错。
      

  2.   

    总感觉PHP不太适合用对象。discuz WordPress uchome 用函数用得比较厉害(多)
      

  3.   

    嗯, 是看OO/设计模式/framework的时候了
      

  4.   

    我自已曾经有个项目从留言本写到框架, 前前后后, 一共重构了不下十次, 仍觉得乐亦不乎, 像你现在的迷茫我也曾经有过...或者你还感觉不到框架的威力, 像discuz, 的确,从负载方面来说是非常好, 一开始直接根据业务加载需要的数据,这样做也是节省成本的一种方法, 但你也知道,这太缺乏扩展性...你看discuz有ucenter,uchome, 他们几个应用程序合在一起连个通用的模板页头都没,6.0之后, 凡是康盛的产品都架接在ucenter平台上,分开来就是几个web应用, 你看uchome和dz的common.ini.php几乎都一样的,很多通用的代码库都重复重用,可以说是沉余...以上像dz的设计并不好, 这是dz把结构化程序玩死了, 令都很多整合dz的phper都头大, 所以你想到每一个表建一个类,当表很多时, 显然不现实, 但有一种模式可以很好解决此问题...mvc模式, 一个行为一个方法, 一个页面应用一个类, 视图, 模板分开, 在开源框架上很多都是这种应用,
    一个网站可以有通用的页头页脚, 其中可以架设不同的应用程序,通用的类库...建议楼主你先看CI,看完再看cakephp, 再整合一下他们的思想, 自己写一个轻便的框架, 论负载, 扩展绝不比discuz差...
      

  5.   

    php是弱类型。 是非常特殊的面向对象,学php时不能走java那种oop的路, 自己开拓 新路, 新设计模式, 大多基于 mvc上
      

  6.   

    建一个record class,对每个表都能进行同样的操作。
      

  7.   

    discuz 是专业的论坛程序,追求的是高效率。没有必要做过多的抽象。他的 ucenter、uchome 是分离出的用户管理部分,为嫁接和以后的扩展打下了基础作为通用程序的开发,首推的还是 MVC 结构。你可以使用任何一款适合自己的框架产品,但仍建议你自行开发
      

  8.   

    觉得discuz和uchome的代码很一搬,可维护性差
    倒是WordPress代码让我觉得我还是个菜鸟
      

  9.   

    刚开始做php,都是手写代码,好像效率很低。看样子要学学使用下框架或者一些库
      

  10.   

    ASP 9段。就是要能操作90个字段以上。
    看样样子你还没达到9段阶段,才达到5段。
      

  11.   

    是时候用框架的时候... 人家讲的没错.discuz 负载挺不错.不过代码结构嘛...不说啦...好像ucenter以后的 康盛的东西,开始有版有眼了..
      

  12.   

    用了框架你会感觉变成另外一种语言了个人的感觉:如果要效率,那就写个能优化代码的程序,还有加载xcache这类模块,访问概率高的页面静态或过程化,这些页面代码都用程序生成。访问率低的地方用模板实际运营中真正压力是在数据库,搜索,代码造成的overload比较小。所以索引页,首页尽量避免读写数据库,这块的更新采用refresh on change(数据更新的时候刷新页面)代码真正头疼的是可维护和扩展,mvc虽然是解决办法,但不是很适合解释和一次性型语言。没有完善的开发IDE以前,还处在记事本阶段,就尽量走function和静态类。单独一个网站的话,不会太多代码,问题是下一个网站最好在上个程序的基础上稍微改动(或不改库程序只改配置)就可以重用。小规模代码重用才是最常见的应用,重复劳动是在浪费生命。可惜的是php目前遇到未定义的functio会致命错误而不能动态自动生成,这是阻碍库代码自动生成唯一绊脚石无从下手说明遇到问题了,开始思考了,good
      

  13.   

    这玩意真的不怎么样吧 只是国外好多应用 有空还瞅瞅
    谁知道php咋想别的语言一样转向 好像没有response.redirect
      

  14.   

    其实你这人问题很普遍表是否要做成对象?如果你确实要完全面向模型对象,建议你用cakephp,这是表自动映射到对象的,不用人写那么多的class了
    第二问题:如果你是封装model的,只封装被引用很多,且是业务逻辑的否则,只直定sql语句查询即可!因有的业罗辑比较复杂的页,可能要调用几十个查询,都写成类方法,个人认为没有必要!直接查询取数据就行了!否则就有点形而上学了!
      

  15.   

    对于discuz建议不用看了,uchome,能用的commom函数个别可用其他的,多看看一那的架构和实现机制就行了自已开发,仍要自已写高负载时和可维护上,架构成作用显现
      

  16.   

    代码的组织形式肯定是跟着软件规模走的。如果是一些小软件,那用面向过程的方式来写代码一点问题都没有,甚至更方便更快。但如果软件规模越来越大,那就要考虑分层了,如MVC,这时可以开始使用框架。所以并不是PHP越写越倒退,而是杀鸡焉用牛刀的道理。如果写个投票页都要用CI用ORM,那就得不偿失了。
      

  17.   

    PS,其实我现在看了这么多的回帖,感觉还是用原先的来做好一些,快一些。为什么想到用框架,很多公司面试的时候都说必须MVC,其实说实话,到现在为止,我根本就不懂什么是MVC。
    直接用PHP来做有什么不好,非得左调右调的。但是去公司面试 一般都要求会。但是假如一个网站真的用了cakephp之类的框架的话,要对他进行维护,一般的phper改不了。感觉就是“将简单的问题复杂化”,“形而上学”很多地方根本用不到框架或者smarty 。
      

  18.   

    呵呵,并不是说一定要用框架,不过,我觉得要理解框架的原理
    尤其是做二次开发的,而PHP我感觉大多数都是做二次开发的,还是要看的懂,知道从哪下手改才行。
    哪怕是不遵守它原来的设计思想来写,但是,也要知道应该在哪里改最方便才行。
      

  19.   

    看uchom,discuz这些代码的时候觉得自己的水平还不错。
    但是看zen framework这些东东的时候就觉得自己是菜鸟了。杯具!
      

  20.   


    用header("Location: manage/index.php");
      

  21.   

    怕对象需要额外的解析,装个apc就行了,性能和过程式的没有什么区别。但可读性就差得远了。所以一般没有特殊要求都应该用对象。
      

  22.   


    MVC的发展是web开发一个重要理念和方法.如果你是小站,使用MVC是没有必要的,用了MVC反而到是"负担".而稍大一点的网站,不使mvc结构.你就会发现,有多晕了.
      

  23.   

    下载个LeLeLong框架咯,不用那么头疼
      

  24.   


    PHP 的  Redirect 更灵活.[code=PHP]
    <?php 
    $url = "http://www.csdn.net";
    header("Location: $url");
    exit;
    ?>
      

  25.   


    这个垃圾代码也太多了,一共4行,有三行是没用的
    <?php header('Location: http://www.csdn.net');?>
      

  26.   

    大的项目就用三层写,维护也方便,哪出了问题直接上哪找,调试速度也快PS:我是PHP初学者,一开始做项目我就用三层写的,感觉还行。
      

  27.   


     
    咳咳,那个exit是需要滴
      

  28.   

    看做的项目和情形吧,用函数个人觉得很好了。不一定非要搞个CLASS
      

  29.   

    我是写了一个轻量级的MVC框架自用
    就是没带ORM,我觉得php实现orm性能实在是不咋地,特别是active record那样的orm
    我一般抽象出一个DAL供model调用,然后自己写sql语句实现
      

  30.   


    弱类型和OO没有必然关系。
    只不过弱类型可以依靠duck typing,用不到abstract class和interface,这两个东西出现在php里有点多余,最多起到一点规范代码的作用
      

  31.   

    半年过去了,重新回到这个问题上来,哎,并没有改变处理方法。
    对于框架仍旧是十分陌生和反感的。现在我有自己的常用代码,比较熟练这些代码,基本上不会遇到解决不了的处理,代码是来自discuz的,然后自己另外加了一些,也修改了下。算是用的discuz的“框架”吧,但不是标准的。
      

  32.   

    初学的比较适合ci框架,严格按照mvc写的,controller ,model ,views,而且可以把smarty 整合进去,很方便,每个model 可以继承orm_model ,每个model 映射一张表,值得一看,类库少,入门简单
      

  33.   

    OO+框架。关键是要自己写。php用函数太烦人了。
      

  34.   

    我就是用OOA OOD OOP的,但是有自己的思路了。做久了就是有自己的一套方法了。面向对象感觉相当强大的,每个类都封装了很多功能,用ajax也方便,前台也不用太多代码,直接输出属性或者一个方法就可以了。而且有些类都可以重用的,还有页面复杂的话类就肯定会多,用面向过程也一样的,也要有很多代码的。但是有一点是肯定的,就是面向对象是为了开发出更优秀的WEB软件,相对于面向过程更适合团队合作。但也没必要为了面向对象而把开发搞得很复杂。面向对象就是为了把系统需求更自然的变成计算机语言。
      

  35.   

    总有一天你会知道框架的好处,不用框架的PHP才是落后的。好的框架都可扩展,根本就不死板。再说了轻巧框架运行速度一点都不慢。你觉得0.02秒和0.0002秒有很大差别吗?是10倍吗?但你能感觉出来?小的网站就自己按自己编程的习惯,写自己的框架,不断地完善,不断地扩展,你会发现越用越不好用,自己也在提高,以后做中大项目的时候就不用担心了。
      

  36.   

    mvc是分布式开始
    试下thinkphp是中文的框架
      

  37.   

    水说的啊! PHP以后会越来越好!
      

  38.   

    是看OO/设计模式/framework的时候了
      

  39.   

    初学的比较适合ci框架,严格按照mvc写的,controller ,model ,views,而且可以把smarty 整合进去,很方便,每个model 可以继承orm_model ,每个model 映射一张表,值得一看,类库少,入门简单
      

  40.   

    现在我php+html混乱感觉还可以~但这代码看起很烦锁~大家给我指条明路,我接下来该看看哪方面的书~
      

  41.   


    适合看别人写的代码,discuz、WordPress、phpwind
    有的时候感觉自己还挺牛的,但是有的时候却感觉到什么都不是,菜得要命。。
    http://topic.csdn.net/u/20101008/16/c5e0c6be-d3f3-48b9-8934-391e5c9a355e.html
      

  42.   

    WordPress 的代码让我感觉到优越感,自信.
    discuz和uchome的代码 让我感觉到自卑
      

  43.   


    我觉得中国人(其实是亚洲人)和欧美人的思维确实很不相同。
    看WordPress,里面无需的代码一大堆,代码一行行的却是看上去技术很牛逼一样。
    我还是比较喜欢国人自己开发的PHP程序。我觉得discuz 和 uchome 写的很不错,比WordPress强多了。
    另外,国外一个火爆的BBS程序phpBB什么的,相当于国内的discuz程序。
    晕菜,你装他还得特殊的环境配置,动不动就执行超时,而discuz是从来就没有的。
    感觉很多人,尤其是菜鸟和初级的,看到什么都觉得国外的好。
      

  44.   

    哈哈,用框架时间常了都会有这样的问题,框架把php底层的编程都封装起来了,渐渐的基础语法当然就记不起来了。
      

  45.   


    是的,可是HR一听说连邮箱正则就不会写就PASS了。可惜我一直用isEmail
      

  46.   

    <?php
    include_once("incClass.php");class DAO{
    protected $conn;
    protected $table;
    public $errors;
    function __construct($table){
    $this->conn = getConn();
    $this->table = $table;
    $this->errors = false;
    }
    function get($Id){
    $rs = $this->conn->execute("select * from $this->table where id =$Id");
    return  $rs->GetArray();
    }
    function save($fields,$Id = false){
    if (!$Id) {
    //insert
    $rs=$this->conn->Execute("SELECT * FROM $this->table");
    $insertSQL = $this->conn->GetInsertSQL($rs, $fields);
    $this->conn->Execute($insertSQL); 
    if ($this->conn->ErrorMsg()) $this->errors = $this->conn->ErrorMsg();
    }
    else {
    //update
    $rs=$this->conn->Execute("SELECT * FROM $this->table where id=$Id");
    $updateSQL = $this->conn->GetUpdateSQL($rs, $fields);
    $this->conn->Execute($updateSQL);
    //if ($this->conn->ErrorMsg()) $this->errors= $this->conn->ErrorMsg();
    }
    }
    function delete($Id){
    $sql="delete from $this->table where id=$Id";
    $this->conn->execute($sql);
    if ($this->conn->ErrorMsg()) $this->errors= $this->conn->ErrorMsg();
    }
    }class IdbDao extends DAO {
    function __construct(){
    parent::__construct("idb");
    }
    function delete($id){
    $sql = "delete from amendsdetaildb where Iid=$id";
    $this->conn->execute($sql);
    parent::delete($id);
    }

    }class AdmendsDetailDbDAO extends DAO {
    function __construct(){
    parent::__construct("amendsdetaildb");
    }
    function getDetail($Iid){
    $rs = $this->conn->execute("select * from $this->table where Iid =$Iid");
    return  $rs->GetArray();
    }
    }class ObjectDbDAO extends DAO {
    function __construct(){
    parent::__construct("objectdb");
    }
    }?><?php
    include_once("incClass.php");
    include_once("DAO.php");
    include_once("num2rmb2.php");
    class LawCase{
    private $caseNum;
    private $registerTime;
    private $endTime;
    private $investigation;

    function __construct($caseNum,$registerTime,$endTime,$investigation){
    $this->caseNum = $caseNum;
    $this->endTime = $endTime;
    $this->investigation = $investigation;
    $this->registerTime =  $registerTime;
    }
    function putOnRecord(){

    }
    function endACase(){

    } function makeFiles(){

    }
    }class Investigation{
    protected $investInfo;
    protected $idbDao;
    protected $Iid;

    function __construct(){
    $this->idbDao = new IdbDao();
    }
    function getInvestInfo(){
    return $this->investInfo;
    }
    function setInvestInfo($arr){
    $this->investInfo = $arr;
    }}class EInvestigation extends Investigation {
    private $highwayEstates;
    private $admends;
    private $detail;
    private $admendsDetail;
    private $EIinfo;
    private $EIid;
    private $ADDAO;
    private $IDAO; function __construct($id = false){
    parent::__construct();
    $this->highwayEstates = false;
    $this->EIinfo = false;
    $this->EIid = $id;
    $this->ADDAO = new AdmendsDetailDbDAO();
    $this->IDAO = new IdbDao();
    $this->admends = false;
    $this->detail = false;
    $this->admendsDetail = false;

    }
    function calculateAdmends(){
    $this->initHighwayEstates();
    $total = 0;
    $detail = "";
    $admendsDetail = "";
    $sum = 1;
    foreach ($this->highwayEstates as $key => $value) { $perTotal = $value["admendsPrice"]*$value["num"];

    $detail .= $value["admendsName"].Transform($value["num"]).$value["admendsUnit"].";";
    $admendsDetail .= $sum."、".$value["admendsName"].vsprintf("%1\$.0f",$value["num"]).$value["admendsUnit"]."×".
    $value["admendsPrice"]."元/".$value["admendsUnit"]."=".$perTotal."元;";
    $sum++;
    $total = $total+$perTotal;
    }
    //$this->admends = vsprintf($total,"%1\$.2f");
    $this->admends = $total;
    $this->detail = $detail;
    $this->admendsDetail = $admendsDetail;
    }
    function getAdmends(){
    if (!$this->admends) {
    $this->calculateAdmends();
         $t = $this->admends;
    }
    else $t = $this->admends;
    $t = vsprintf("%1\$.2f",$t);
    return $t ;
    }
    function getDetail(){
    if (!$this->detail) {
    $this->calculateAdmends();
    return $this->detail;
    }
    else return $this->detail;
    }
    function getAdmendsDetail(){
    if (!$this->admendsDetail) {
    $this->calculateAdmends();
    return $this->admendsDetail;
    }
    else return $this->admendsDetail;
    }
    function initHighwayEstates(){
    if (!$this->highwayEstates) {
    if (!$this->EIid) {
    return  "没有赔偿明细。";
    }else {
    $this->highwayEstates = $this->ADDAO->getDetail($this->EIid);
    }
    }
    }
    function initEInfo(){
    if (!$this->EIinfo) {
    if (!$this->EIid) {
    return "没有赔偿明细。";
    }else {
    $this->EIinfo = $this->IDAO->get($this->EIid);
    }
    }
    }
    function getReportInfo(){
    $this->initEInfo();
    $this->initHighwayEstates();
    $fields = array();
    $fields = $this->EIinfo[0];
    $fields["admends"] = $this->getAdmends();
    $fields["detail"] = $this->getDetail();
    $fields["admendsDetail"] = $this->getAdmendsDetail();
    //date("Y-m-d,H:i",strtotime($rs->fields["endTime"]));
    $fields["investDate"] = date("m月d日",strtotime($fields["investTime"]));
    $fields["investTime"] = date("H时i分",strtotime($fields["investTime"]));

    $fields["breakDate"] = date("m月d日",strtotime($fields["breakTime"]));
    $fields["breakTime"] = date("H时i分",strtotime($fields["breakTime"]));

    $fields["endDate"] = date("m月d日",strtotime($fields["endTime"]));
    $fields["endTime"] = date("H时i分",strtotime($fields["endTime"]));
    return $fields;
      
    }
    function getRepairInfo(){}
    }function encoderTransferForArray($s,$f,$a){
    //$value = iconv($s,$f,$value);
    foreach ($a as $key => $value) {
    $a[$key] = iconv($s,$f,$value);
    }
    return $a;
    }
    ?>
      

  47.   


    同意,能够运行就行。看到那些喜欢用OOP(滥用OOP) 和MVC的人写的那么一大堆臃肿的代码就觉得烦。