php中样实现java中的class.forName(className)功能.

发表于:2007-05-25来源:作者:点击数: 标签:javaphp中样class.forNam实现
我最近在学习GOF的23种设计模式,试着用 php 来实现这些模式.可是遇到了一些问题.当我构思用php来实现Factry模式中的抽像工厂的动态加载功能时发现不能实现,我在google查了好久也没有得到相关的帮助,所以无法像 java 那样用class.forName(className)来实现动

我最近在学习GOF的23种设计模式,试着用php来实现这些模式.可是遇到了一些问题.当我构思用php来实现Factry模式中的抽像工厂的动态加载功能时发现不能实现,我在google查了好久也没有得到相关的帮助,所以无法像java那样用class.forName(className)来实现动太加载,请问用php怎样实现这样的功能?

Thanks all.

 cnw168 回复于:2004-06-11 09:26:07
没有听懂,可以说的再细点吗。:)

 dualface 回复于:2004-06-11 22:35:02
C++或者Java来试验吧,php4的oo能力还达不到那个程度。

 longnetpro 回复于:2004-06-12 00:20:16
基本上是可以的。

[code:1:77fd787f2b]
class ClassFactory
{
    function &forClass($className){
        if (class_exists($className)){
            $obj = new $className;
        }else{
            $obj = null;
            // or error handler here
        }
        return $obj;
    }
}

// Create an object which class type is 'MyClass'

$className = 'MyClass';
$obj =& ClassFactory::forClass($className);

if ($obj === null)
    echo 'Failed to create class '.$className.' object.';
else
    echo 'Create class'.$className.' object suclearcase/" target="_blank" >ccessfully';
[/code:1:77fd787f2b]

基本上这就是类工厂模式最简单的实现。另外,关于类的设计模式,并不一定代码都完全一样或是在形式上一样,只要能实现功能就可以了。PHP4中的变量无类型及变量的变量的特性,如果灵活运用并运用得当的话,基本可以实现JAVA可以实现的设计模式,不过没有必要一定要追求代码形式一样。其实有时用PHP4实现的设计模式比用JAVA实现起来更容易,因为PHP没有JAVA那么严格。

其实对什么设计模式,我认为没有必要太过拘泥,针对不同的使用环境,用不同的方法,实现的过程也不尽相同。设计模式只不过是一种思想,没有什么。但如果把这些思想太过条条框框了的话,反而感觉很别扭。JAVA是很严谨的,但我总觉得在某些方面它做得太过烦琐,虽然很规范但有时又过于严格,对做某些应用来说反而不是很好。PHP4就与JAVA的特性有些相反,PHP5会好多了。但是,只要一种语言支持OO的大部分功能,OO的各种设计模式从理论上都能够用这种语言实现(模式与编程语言无关)。因此PHP4可以基本实现各种设计模式,只是说实现的程度可能不够深或是不完全。但从表面上,无论是模拟还是真实的,总之还是能实现的——比如在CU上,我很早还发过一帖,模拟OO的单子模式(singleton),比用JAVA的还要简单,但模式特性也实现得足够完全。而Factory模式,虽然用PHP代码不能象JAVA那样(PHP4的reflection功能还不强),但基本可以用我上面的代码进行模拟,功能可能是差一点,但总之是模拟成功了,在应用中,很可能也只需要用到我模拟的这个程度,如果想要更复杂的实现,可以另外运用PHP的灵活性来实现——当然这个实现需要根据需求,也需要程序编制者对设计模式有深刻的理解以及对PHP熟练地掌握以及有足够的编程水平与技巧。但不管怎么说,设计模式用PHP是可以实现的,在PHP4下也可以。

 shukebeita 回复于:2004-06-12 01:14:09
方向是正确。我来试一试看看能不能说清楚。Factory Method 是面向对象程序设计中一个重要的模式(什么是模式?是前人总结的一系列解决问题方法,就像武术套路拳法心诀。我们在这里经常讨论的多数问题例如如何设置apache,如何发送邮件了,用不用模板了等等都属于一些简单的擒拿散手,收拾个地痞流氓还可以,真要遇到大家伙来踢馆没有成路数的真功夫要想拿下的确很难,这时就需要经半年修炼而成的“模式”了。楼主你也别着急,为了让更多的朋友能够理解我们在说的什么,我先介绍一下Factory method,你问题的答案在最后,如果等不及你可以直接看答案。)

还是通过例子来看一看,很多讲OOP的书都是用java或者C++来举例,而且经常用形状啦,水果啦比例子,那些和我们在实际中的应用距离太远。这次我用php中经常要用到的表单处理来举个例子,说明一下。这个例子不是我发明的,我也是从别人那里学来的具体在哪里记不清了,在此对于写出这个例子的原作者表示感谢。

html表单中有一个很麻烦的问题就是验证问题。所以我想试试看用OOP的方法能不能简单一点。
首先我们来构造一个处理表单的类叫Form,它包装了一些通用的表单操作,其中的两个基本操作是验证和数据更新.
[code:1:69bf0df2d8]
class Form
{
    function isValid()
    {
        //表单的验证工作
    }

    function doUpdate()
    {
        //通过验证的表单的操作,比如发送邮件,更新数据库
    }
}
[/code:1:69bf0df2d8]
这个Form类是一个父类,具体的实现要通过扩展它来实现,比如有一个会员注册的表单可以这样扩展:
[code:1:69bf0df2d8]
class RegistrationForm extends Form
{
    //...
}
[/code:1:69bf0df2d8]
类是用来封装功能的,所以不要太追究它里面有什么,也不要问我到底怎么实现的,我现在还不知道,(厉害吧?oop的程序可以这样写,什么都不知道就可以写了.)

好了,现在我们来看看怎么用.
[code:1:69bf0df2d8]
$regForm = new RegistrationForm();

if ($regForm->isValid()) //验证数据无误
{
    $regForm->doUpdate();//进行这个表单的相关操作
}
else
{
    echo $regForm->errorMessage();//显示错误信息
}
[/code:1:69bf0df2d8]
现在可以再进一步,每个表单都有很多的域或者说字段英文叫做(field)我们要对每个字段进行验证通过,才可以认为这个表单里的数据是合法的。所以我们需要充实一下这个Form类实现这个功能。增加3个属性,和一些功能。
[code:1:69bf0df2d8]
class Form
{
    var $fields; //数组包括了表单中所有的字段
    var $valid; //boolean 是否合法
    var $error; //错误信息

    function isValid()
    {
        return $this->valid; 
    }
    
    /**
    * 从数据源中获得表单数据,在使用中这个$source可以是$_GET 也可以是 $_POST
    * 验证的功能实际上在这里实现了。
    */
    function post(&$source) 
    {
        $this->valid = true; 
    foreach($this->fields as $name=>$val) 
    {
$refField = & $this->fields[$name]; // by reference 
if(!isset($source[$refField->getName()])) 
{
if ($refField->isNullAllowed()) 

$this->error .= 'Required field missing: ' . $refField->getName(); 
$this->valid  = false; 

}
else
{
$refField->setValue($source[$refField->getName()]); 
if (!$refField->isValid()) 

    $this->error .= 'Invalid data for field: ' . $refField->getName(); 
    $this->valid  = false; 


}
    }
    return $this->valid; 
}


    function doUpdate()
    {
        //合法表单的操作,比如发送邮件,更新数据库
die('Should be implemented in my children');
    }
}
[/code:1:69bf0df2d8]
注意Form中的 fields 成员 它是一个数组, 数组的每个元素都是一个字段对象 Field。这里看看新的对象Field的内部结构,其实它也是非常简单的。
[code:1:69bf0df2d8]
class Field
{
    var $name;
    var $nullAllowed;
    var $value;
    var $isset;
    var $maxLength;
    
    function Field($name,$nullAllowed,$maxLength)
    {
        $this->name        = $name;
        $this->nullAllowed = $nullAllowed;
        $this->value       = '';
        $this->isset       = false;
$this->maxLength = $maxLength;
    }
    
    function setValue(&$value)
    {
        $this->value = $value;
        $this->isset = true;
    }
    
    function isValid()
    {
        if (!$this->hasValue() || $this->isEmpty())
        {
            return $this->nullAllowed;
        }
        return true;
    }
    
    function isEmpty()
    {
        return empty($this->value);
//return isset($this->value)?false:true;
    }
    
    function hasValue()
    {
        return $this->isset;
    }
    
    function &getValue()
    {
        return $this->value;
    }

    function getName() 
    {
return $this->name;
    }
    
    function isNullAllowed()
    {
        return $this->nullAllowed;
    }
}
[/code:1:69bf0df2d8]
这个不用多解释了吧,它包装了对于一般字段的一些通用操作,获得字段名,获得字段值等等。我们不能直接来使用它,我们需要根据字段的不同要求来扩展它,比如我们需要Email字段,数字字段,日期字段等等,就要对它进行扩展然后重写一下验证规则就好了。

下面是一些简单的例子:
[code:1:69bf0df2d8]
class EmailField extends Field 

    function isValid() 
    { 
        if (parent::isValid()) 
        { 
            if (!$this->isEmpty()) 
            { 
                return $this->checkEmail(); 
            } 
            return true; 
        } 
        return false; 
    } 
     
    function checkEmail() 
    { 
       return  eregi("^[^@ ]+@[^@ ]+\.[^@ \.]+$",$this->getValue()); 
    } 
     


class PhoneField extends Field 
{
    function isValid() 
    { 
        if (parent::isValid()) 
        { 
            if (!$this->isEmpty()) 
            { 
                return $this->checkPhone(); 
            } 
            return true; 
        } 
        return false; 
    }

function checkPhone() 
{
return eregi("^[0-9\\(\\)\+-]{1,20}$",$this->getValue()); 
}
}

class TextField extends Field 
{
    function isValid() 
    { 
        if (parent::isValid()) 
        { 
            if (!$this->isEmpty()) 
            { 
                return $this->checkText(); 
            } 
            return true; 
        } 
        return false; 
    } 

    function checkText() 
    {
//echo('debuger in textfield');
return true;
    }
}
[/code:1:69bf0df2d8]
字段类我们有了,需要在表单对象中使用字段对象我们还要为Form类增加一个新的方法。先来看看我们最终希望怎样来使用这个RegistrationForm类.
[code:1:69bf0df2d8]
$regForm = new RegistrationForm();
$regForm->addField('userName','text',false,64);
$regForm->addField('userPhone','phone'false,10);
$regForm->addField('userEmail','email',false,256);

if ($regForm->post($_POST)) //把$_POST过来的值放到表单对象中并且进行验证
{
    $regForm->doUpdate();//进行这个表单的相关操作
}
else
{
    echo $regForm->errorMessage();//显示错误信息
}
[/code:1:69bf0df2d8]
这里看到我们需要一个新的功能addField来为表单对象添加字段.所以我们仔细看一看addField怎么做的:
[code:1:69bf0df2d8]
function addField($name, $type, $nullAllowed,$maxLength=99) 

     $this->fields[$name] =& FieldFactory::createField($name, $type, $nullAllowed,$maxLength); 

[/code:1:69bf0df2d8]
参数中第一个是字段名,第二个是类型,第三个字段是否可以空缺,第四个最大长度.

哈哈,写到这里今天的主角Factory Method才正式登场。

我们看看这个FieldFactory类能做些什么
[code:1:69bf0df2d8]
class FieldFactory 

    function &createField($name, $type, $nullAllowed,$maxLength) 
    { 
        switch ($type) 
        { 
            case 'text'  : $class = 'TextField'; break; 
            case 'number': $class = 'NumberField'; break; 
            case 'email' : $class = 'EmailField'; break; 
    case 'phone' : 
    case 'fax':
    $class = 'PhoneField'; break; 
    default      : $class = 'TextField'; break; 
        } 
        return new $class($name, $nullAllowed,$maxLength); 
    } 

[/code:1:69bf0df2d8]
它的功能更是简单,只有一个switch把所谓的字段类型和要用到的类对应起来,然后生成一个这个类的实例并返回给它的调用者。这里的FieldFactory 用到的就是典型的Factory Method。它就像烤面包的师傅,你要什么面包他烤给你就好了,只要你要的面包而不是包子他就能给你做得出来。但是,这么大费周折的使用 Factory Method 有什么好处呢?哪些情形下该用Factory Method? 我今天实在写太多了,胳膊都酸了还是听听大家的讨论吧。


关于楼主问题的解答
好消息和坏消息
先说坏消息,java我不会,从你提供的代码中看估计是利用了一种java中叫做reflection的机制(我猜reflection和摸骨相面差不多看到你就知道你是谁的孩子,祖上有哪些看家的本事)。但是php中根本没有没有什么forname 的东西。

好消息是factory method和反射机制没有必然关系,反射机制只是java中实现factory method的一种方法。你完全可以用更简单更容易理解的办法来实现 Factory method 比如说在配置文件里人工建立类型和类名的对应关系,然后用FieldFactory中的方法来创建这样的一个实例返回给他的调用者就可以了。这也就是我们常说的OOP是思想而不是某种特定的语言特征。

如果你真的够勤奋,喜欢孜孜不倦的探索可以看一看在目前的php中有以下一些关于class的函数,有兴趣看看能不能用它们模拟出来java的反射机制。
[code:1:69bf0df2d8]
class_exists - Checks if the class has been defined
get_class_methods - Returns an array of class methods' names
get_class_vars - Returns an array of default properties of the class 
get_class - Returns the name of the class of an object
get_declared_classes - Returns an array with the name of the defined classes
get_object_vars - Returns an associative array of object properties
get_parent_class - Retrieves the parent class name for object or class
is_a - Returns TRUE if the object is of this class or has this class as one of its parents 
is_subclass_of - Returns TRUE if the object has this class as one of its parents 
method_exists - Checks if the class method exists
[/code:1:69bf0df2d8]

太累了,贴不动波霸了。大伙将就着看吧。 :em06:

 longnetpro 回复于:2004-06-12 02:36:23
shuke,你何必搞得这么累呢。你那么大一段代码,前面与Factory没有太大关系,就是一两个基类七搞八搞搞出N多子类出来。后面的才是关键,主要是根据类名生成不同类型的对象,被生成对象的类名才是Factory模式中最重要的,其它的参数只是辅助作用。至于说生成了对象之后的方法调用,就不是模式的问题,而涉及到OO的重载与多态的方面了。楼主还是看我的代码比较容易理解一些,shuke的代码适合于对OO理解比较深入一点的人看。还有什么reflection机制,说实话,我认为它只是一个术语,这个术语描述一套固定的东西,PHP4的这个机制不太好(其实就是支持度不够或是不完全),但是完全可以模拟出来,我的代码可以算是其中的一个部分。shuke说的核心内容,我看了一下,与我的几乎完全一致,只是他用更为具体的例子说明原理(但这个例子对一些初学者来说似乎难了一点)。其实说白了,还是那个面包师与客户的比喻最能说明问题——只要是面包,不管是包肉的还是包豆沙的,他都能做出来给你。我的例子就更大了一点,无论是什么,只要是个东西,这个人都能做出来给你——是个更广义的Factory。JAVA中的Factory也是广义的,当然,它也可以是更小一点的Factory。

在此提一个建议,在没有搞清楚OO的本质特点,没有搞清楚OO结构之间如何协调的,没有搞清楚OO的工作原理及实现原理的情况下,一下不要上升到抽象的设计模式,因为很多概念是建立在OO本质概念的情况下的,也是利用了OO的这些本质概念。因此,如果不了解OO的本质,看设计模式还是一样的云里雾里的。至于说如何了解,大家还是去看专门讲解OO的书吧(不是专门讲解JAVA或什么语言的)。这里我仍然强力推荐“thinking in Java”这本书,虽然它是以JAVA为语言载体,但它叙述的是OO的思想,因此书名为“thinking in Java”,绝对值得反复研读(我就曾一字不漏看过三遍之多,书店里站着看的英文原版,不过太贵没买:)),最好是看英文版并有中文对照(便于理解),你专业英语好也可以不看中文,但不推荐只看中文版,因为只看中文版的可能会因翻译问题带来误解。

 sleep_meng 回复于:2004-06-12 03:48:34
谢谢大家的帮助.

开始我也想过用这样的代码实现:
    function &forClass($className){ 
        if (class_exists($className)){ 
            $obj = new $className; 
        }
    }

但以前用的语言都很注重类型,由于以前的那种编程习惯.一时没有考虑到php的无类型特性.所以老是学得$className是一个字符串变量,应该不可以进行 new $className操作. 
      看了大家的帮助后,终于实现了,更从大家的帖子中学到很多的东西.

      谢谢大家的帮助,
      非常感谢!

 leaper 回复于:2004-06-12 08:39:33
模式设计的东西一定好吗,一个本来很小的东西,通过OO+模式的方法反倒变成复杂化,我觉得未毕是件好事。

 tonera 回复于:2004-06-12 09:49:42
这么好的贴子,占个位先。 :D 

觉得longnetpro的例子简单明了。

leaper的观点有实用价值,但是如果楼主专攻技术问题的话则不适用了。一般来说,来这里(技术论坛)讨论的目的应该是“如何做”,而不是“该不该做”。

经过这段时间的熏陶,对OO的思想的理解又升一级!这是一个比较抽象的概念,以前头脑中的“方法”和“属性”的概念跟现在的完全不同。

sleep_meng 的问题也给我启示,由变量函数(这东西很好,在我的一个验证类中就是这么干的)、变量的变量,还应该举一反三,联想到有“变量类”。

BTW:shuke的那个验证类扩展性不好,如果要新增一个验证规则,就要重写或是继承。还有,当要验证的值允许为空时你那个类就不行了。还是觉得dualface的那个类(值和验证规则)比较好,如果再加上我后面补充的一个用户自定义验证规则的接口,就可以满足任何苛刻用户的需求了。

 shukebeita 回复于:2004-06-12 11:15:43
[quote:6d64aa021e="longnetpro"]shuke,你何必搞得这么累呢。[/quote:6d64aa021e]
那个是为了回应tonera看我的表单验证类的要求,合到一起写了。我在挑灯夜战,奋笔疾书的时候谁料你偷偷跑来抢了我的沙发,发帖的时候看到你的了。但是我的已经写好了,又不能倒回肚里去 :roll: 所以就发了。完全同意你的观点(怪事,我们的观点经常是一样的。)
[quote:6d64aa021e]shuke的那个验证类扩展性不好...[/quote:6d64aa021e]
那个类设计上可以允许空值,可能是老版有bug。dualface的类当然也好。总之一个原则:能让你多赚钱少干活的就是好类。

[quote:6d64aa021e]模式设计的东西一定好吗,一个本来很小的东西,通过OO+模式的方法反倒变成复杂化,我觉得未毕是件好事。 [/quote:6d64aa021e]
我个人比较笨,基础又差,活又多所以能偷就偷,模式这个东西比较合适,前人的经验都在里面,遇到问题你只要照猫画虎套用就好了,比较适合我这样的懒人用。

这次多少也要来个素的。



这种类型的mm我喜欢,有认识的帮我介绍一下。


 longnetpro 回复于:2004-06-12 12:28:55
[quote:e4469771cb="shukebeita"]怪事,我们的观点经常是一样的[/quote:e4469771cb]

当然当然,我们的思维比较开放嘛。也够默契!不过你好象比我好一点,我经常在这里说空话,讲些狗屁不通的大道理。你呢,不但讲的道理比我还大,还不时搞几个波霸吸引别人的眼球赚名声,真有你的!

 leaper 回复于:2004-06-12 13:55:33
要是我来当这个项目的leader

我肯定否定楼上的技术与模式。
验证我觉得javascript完全可以在client完成,没有必要提交到server,这明显是在给服务器增加负担,在不匹配时,又要返回客户端,多累啊

不管楼上的两位写得多好,用了什么技术,但可以肯定,没有实用价值,这种类只适合教学用,不应用到project中

当然楼上两位技术确实不错,为什么不用来写些实用的东西,作些实在的项目。就像中国人总喜欢拿“XX奖”,确不能拿诺贝尔奖呢?

 sleep_meng 回复于:2004-06-12 14:04:48
谢谢大家的指点,

     小弟现在正上大学二年级,这个假期要为学校开发一个系统,实现学生在线选课,教师管理,新闻发布等等功能.还要和原来的论坛集成.所以我正在考虑用Porxy模式配合Factry模式实现权限系统,用类把与数据库有关操作封装起来.这样在开发时就不用写那些烦人的SQL语句,而且还要考虑以后的扩展.
    但是由于php的OOP功能不是很强,所以设计时遇到了很多困难,所以想来这里得到大家的指点.也希望php的OOP功能能发展得更完美.
    看了大家的回帖,对小弟的设计很有帮助.

    谢谢大家

 shukebeita 回复于:2004-06-12 14:32:17
[quote:35f2bd37e3="leaper"]要是我来当这个项目的leader[/quote:35f2bd37e3]
我不光让你当leader,你还可以让你兼职三楼楼长。 :D 开个玩笑。

[quote:35f2bd37e3]这种类只适合教学用,不应用到project中[/quote:35f2bd37e3]
我做的东西就是这么用的,当然根据需要有时候会在在前面加一层js方便用户。原则是“双重防侧漏,保护更安全” :m01: 如果你书上学的东西都不能实用,那么你实用中到底用些什么呢?楼主才是强人大学二年级就打算把oop和模式设计玩弄于股掌之间,比那些到了大四才来这里乞讨的强百倍不止。在用中学才是学习的捷径。建议楼主完成项目以后,将心得体会写出来回报社会。


[quote:35f2bd37e3]为什么不用来写些实用的东西,作些实在的项目。[/quote:35f2bd37e3]就是因为都在做实在的东西所以才不太容易看到“随风潜入夜润物细无声”。longnetpro给我发过他几个文件观摩过,写得非常好。比什么“中国第一天下无敌XXXPHP大引擎”实惠多了。不过是不是开源发布我们要尊重当事人本人的意愿,不能强买强卖。 :em17: 我没有理想,只要菜钱,不想得奖。

 tonera 回复于:2004-06-12 15:01:22
[quote:d4f6d0df3e="leaper"]要是我来当这个项目的leader
验证我觉得javascript完全可以在client完成,没有必要提交到server,这明显是在给服务器增加负担,在不匹配时,又要返回客户端,多累啊
[/quote:d4f6d0df3e]

极不赞成这种方式。已经讨论过很多次了,这样做哪有安全性可言?

严重同意shuke的“双重防侧漏,保护更安全”措施。 :mrgreen: (形象!)只用JS或只用server端验证都不是好主意。

BTW:楼主才大二啊,呵呵,有前途,无论是学习心态和技术水平,都是现在的学生学习的模范。(是不是太青蛙了??? :mrgreen: )

 leaper 回复于:2004-06-12 15:48:19
[quote:13f9f6fd26="tonera"]

极不赞成这种方式。已经讨论过很多次了,这样做哪有安全性可言?

严重同意shuke的“双重防侧漏,保护更安全”措施。 :mrgreen: (形象!)只用JS或只用server端验证都不是好主意。

BTW:楼主才大二啊,呵呵..........[/quote:13f9f6fd26]


大二有这种的层次确实不错,看来没有浪费大学的时间。好好努力

 longnetpro 回复于:2004-06-12 18:38:07
[quote:b4bbbf79a0="leaper"]验证我觉得javascript完全可以在client完成,没有必要提交到server,这明显是在给服务器增加负担,在不匹配时,又要返回客户端,多累啊

不管楼上的两位写得多好,用了什么技术,但可以肯定,没有实用价值,这种类只适合教学用,不应用到project中。[/quote:b4bbbf79a0]

这话就有些外行了。存在总有理由。既然前人总结出来了,就一定有它的存在价值。不要说它没有什么实用价值,只适合用来教学——这只是你还没有了解或是没有体会到它的重要性,也不知道它会在什么时候用到。你甚至可以这么说,数据结构也只适合教学,没有必要用它,只要你没有用到它,它当然没有实用价值了,也只适合教学。其实楼上几位讨论的验证类很有用处,也很必要,这是安全保障的第一道门。

另外至于那个验证的问题,一般情况下我的做法是:客户端用不用JS验证是次要的(用与不用都可,一般是用),但在服务器端一定要再做一次验证。因为客户端的验证你做得再好都可能被欺骗,是不能相信的,只有服务器端的验证才是相对安全的。在客户端做验证的好处是先验一道,到服务器端再验的时候基本上就一次通过了,不需再做额外的处理,这样一样也会减少服务器的负担。但服务器验证不能没有,否则就有可能会被客户端钻空子,虽然服务器端不验证可以又减轻一点服务器负担,但安全风险却加大了数倍,不值。


[quote:b4bbbf79a0="leaper"]为什么不用来写些实用的东西,作些实在的项目。[/quote:b4bbbf79a0]

shuke还想靠它混个菜钱,我是连菜钱都不打算靠它混,纯个人爱好,因此做不做实在的项目对我来说区别不大。我只要有本事看懂别人做的东西就可以了。谁叫我以后是打算请人帮我实现我的想法呢?


[quote:b4bbbf79a0="leaper"]就像中国人总喜欢拿“XX奖”,确不能拿诺贝尔奖呢?[/quote:b4bbbf79a0]

不是我说的话,诺贝尔奖就真的是世界最高奖吗?中国人拿不到诺贝尔奖是有一定的政治原因的。而且现在诺贝尔奖的含金量到底有多高都有人打问号了。诺贝尔奖现在其实很多方面已失去公平性了。中国人在六十年代就可以拿到诺贝尔奖的,但因为种种原因放弃了(主动放弃的)。还有达赖的诺贝尔和平奖,高行健的诺贝尔文学奖都是什么?纯扯淡的!政治因素在中间,没意思。在纯技术上的,中国人得奖的多了,比如计算机领域的图灵奖就是该领域的诺贝尔奖。还有数学方面的等等。只是大家多数只知道有个诺贝尔奖。因此,没有必要对诺贝尔奖耿耿于怀。以后中国也搞个什么奖,发给老外,不也一样的吗?你的国力搞起来,经济搞起来,科技搞起来,什么奖不都是一样的?得不得奖又有什么不同呢?比如说那个什么电影的奥斯卡奖,我认为中国电影参加也是扯淡的,文化背景都不一样,评委多数是老外,中国人认为好的电影一个奖没得,中国人认为不怎么样的,得一串大奖——这多没意思啊,你说有必要追求这个什么奖吗?当然,诺贝尔奖与这个有点不同。但广义上其实也一回事。你只要做好自己的事,得不得奖,得什么奖都无所谓。中国人在乎这个,主要是要面子。中国人看重这个,还不是把这个看做一种权威,一种象征?其实根本没有什么必要。诺贝尔奖获得者,也只是一名教授,也是个普通人,一次得奖也只是一次的荣誉。


[quote:b4bbbf79a0="leaper"]大二有这种的层次确实不错,看来没有浪费大学的时间[/quote:b4bbbf79a0]

不错是不错,但要警惕。打好基础才是大二应该做的事,做什么系统都是次要的事,在本职工作做清楚的情况下再做这些事情(当然如果不是本专业,只是做为兴趣又另当别论了)。总之,就是在上大学期间,学好专业是主要任务,其余的为做项目而做项目是不可取的。或者是不打好基础,不研究基础理论,想直接从某些项目中学到某些知识,除非你是天才,悟性奇高,你学到的东西也是很浅的,或是难以深入,这样虽然好象在大学几年里成就不少,做的项目很多,其实也是浪费了时间。最好是兼而有之,项目也做,基础也打好了,用理论来指导实践,再在实践中检验理论并掌握理论到最后能灵活运用。

 财狼 回复于:2004-06-12 20:52:09
[quote:0cd5b2b1f5="leaper"]要是我来当这个项目的leader

我肯定否定楼上的技术与模式。
验证我觉得javascript完全可以在client完成,没有必要提交到server,这明显是在给服务器增加负担,在不匹配时,又要返回客户端,多累啊

不管楼上的..........[/quote:0cd5b2b1f5]

请原谅我这么说:我看你这个 leader 根本不合格!

只要把浏览器的 js 关掉,你做的 client 端验证将全部失效!client 未经验证的数据直接写入数据库,到时候你就哭吧。

硬件的价格掉得那么快,还有必要操心这点负担?

当然这是题外话,我从这个帖子学到不少东西,我也谢谢各位

 sleep_meng 回复于:2004-06-16 00:12:08
看了‘ 轻量级OO框架2.0 ’这个帖子,对我在设计这个系统时又有了一些进展,当我把我这个系统写完后也把我的一些实现思想写出来供大家参考参考。以前来论坛只是看帖,写完这个系统后也拿出来共享一下(不能在自私了:-)

 hongweig 回复于:2004-06-17 10:37:35
[quote:691141f5e3]
不错是不错,但要警惕。打好基础才是大二应该做的事,做什么系统都是次要的事,在本职工作做清楚的情况下再做这些事情(当然如果不是本专业,只是做为兴趣又另当别论了)。总之,就是在上大学期间,学好专业是主要任务,其余的为做项目而做项目是不可取的。或者是不打好基础,不研究基础理论,想直接从某些项目中学到某些知识,除非你是天才,悟性奇高,你学到的东西也是很浅的,或是难以深入,这样虽然好象在大学几年里成就不少,做的项目很多,其实也是浪费了时间。最好是兼而有之,项目也做,基础也打好了,用理论来指导实践,再在实践中检验理论并掌握理论到最后能灵活运用。

[/quote:691141f5e3]


为什么不早点认识 你。
我上大学的那会儿,老大,你哪儿啊?

 hongweig 回复于:2004-06-17 10:38:14
唉,现在想哭都不行了。

 飞雪恨水 回复于:2004-06-17 11:18:27
汗~
抓紧学习
各位的论点太精彩了

原文转自:http://www.ltesting.net