高段位php问题,高手接招:如何调用未知名称的类 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iloveyou
V2EX    问与答

高段位php问题,高手接招:如何调用未知名称的类

  •  
  •   iloveyou 2011-01-05 16:52:38 +08:00 5799 次点击
    这是一个创建于 5465 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这种新建类的实例可以这样:
    $className = '未知类名称';
    $newClass = new $className;

    但是如果是直接操作类本身呢?
    $className = '未知类名称';
    $className :: method(); //这行报错。

    请问第二种怎么处理,除了用eval方法。
    我现在在开发一个php mvc框架的ar部分需要用的这些。
    35 条回复    1970-01-01 08:00:00 +08:00
    lamengao
        1
    lamengao  
       2011-01-05 17:11:48 +08:00
    call_user_func
    iloveyou
        2
    iloveyou  
    OP
       2011-01-05 17:28:52 +08:00
    @lamengao 多谢了,我去看看这个函数
    iloveyou
        3
    iloveyou  
    OP
       2011-01-05 17:45:30 +08:00
    再追加一个问题:

    刚你说的函数是调用类动作的,如果我想给一个未知名称的类中的一个公共静态变量赋值怎么办?

    示例:
    $className = '未知类名称';
    $className :: parameter = 'test'; //这行报错。
    fmfsaisai
        4
    fmfsaisai  
       2011-01-05 17:52:50 +08:00
    $className :: method();
    你确定这样会报错?PHP什么版本的?
    以下代码可以运行PHP 5.3.3
    <?php
    class aa{
    public static $var;
    public static function a(){
    echo self::$var;

    }
    }

    $cc = 'aa';

    $cc::$var = 123;
    $cc::a();
    iloveyou
        5
    iloveyou  
    OP
       2011-01-05 18:09:30 +08:00
    @fmfsaisai 我用的是php-5.2.9-2,确实不行,后来我用了eval方法:

    eval($class_name.'::$parameter = "xxx";');
    fmfsaisai
        6
    fmfsaisai  
       2011-01-05 18:14:31 +08:00
    @iloveyou
    升级吧-_-
    iloveyou
        7
    iloveyou  
    OP
       2011-01-05 18:16:52 +08:00
    @fmfsaisai 看来你是php高手了,一下子就明白我的问题,还写出示例。我就是因为因为php水平遇到瓶颈才决定自己开发个框架练练,好多概念方法都不懂。不过目前还算顺利,控制器和视图部分基本完成了,现在正在弄model部分,这部分最麻烦。打算以后一直完善这个框架,等完善了就作为自己的主力开发框架。
    iloveyou
        8
    iloveyou  
    OP
       2011-01-05 18:18:07 +08:00
    好了,要下班了。改天聊,再次说声谢谢。
    lamengao
        9
    lamengao  
       2011-01-05 18:32:36 +08:00
    @iloveyou 在PHP 5.3 中 $classname::$static_var 已经可以正常工作了。(注意静态变量前面的'$')
    ayanamist
        10
    ayanamist  
       2011-01-05 18:54:29 +08:00
    你可以去看看RefectionClass这个类的使用
    summic
        11
    summic  
       2011-01-05 19:05:19 +08:00
    类反射全部搞定lz的需求
    CupTools
        12
    CupTools  
       2011-01-05 23:22:18 +08:00
    顺便说句...用 PHP 5.2的同学写Daemon会抓狂的...内存直线上升。5.3才是王道

    http://www.php.net/manual/en/features.gc.performance-considerations.php

    我表示下面的图很有爱
    ayanamist
        13
    ayanamist  
       2011-01-06 00:24:30 +08:00
    @CupTools 你大概没有弄明白官方这个图是什么意思吧。写Daemon要自己做unset的,官方那个图代表5.3的垃圾收集更智能而已,在5.2中可以通过手工代码实现的
    napoleonu
        14
    napoleonu  
       2011-01-06 00:30:54 +08:00
    写网站,为什么不用C
    liruqi
        15
    liruqi  
       2011-01-06 01:37:15 +08:00
    腾讯才用C
    企鹅全家都用C
    TheOnly92
        16
    TheOnly92  
       2011-01-06 07:14:23 +08:00
    写网站而已,为什么要用到 C?
    summic
        17
    summic  
       2011-01-06 09:22:36 +08:00
    @napoleonu
    写网站为什么不用汇编?
    CupTools
        18
    CupTools  
       2011-01-06 11:58:24 +08:00
    @ayanamist 我确定一定以及肯定,我将全部变量重设了。我亲身做试验,在5.2下面,每完成一个while,5.2都会增加200kb内存;然后5.3维持在3.4M,100000个while也没有太大的内存变动。在5.2有gc_collect_cycles()?
    napoleonu
        19
    napoleonu  
       2011-01-06 12:07:18 +08:00
    @summic @TheOnly92 看起来酷啊
    CupTools
        20
    CupTools  
       2011-01-06 12:11:54 +08:00
    @CupTools 并且,官方都说了,unset在某些情况下是没用的。
    TheOnly92
        21
    TheOnly92  
       2011-01-06 12:24:02 +08:00
    PHP 5.2 才刚刚普遍起来而已,况且我个人的代码有许多功能被 5.3 砍掉了呢,要阅读,修改,重写需要一定时间,所以暂时放着。而且 5.3 才刚出,难保没有什么问题,所以还是静观其变吧。
    CupTools
        22
    CupTools  
       2011-01-06 12:29:02 +08:00
    @TheOnly92 砍掉的,必然有他的道理
    Platinum
        23
    Platinum  
       2011-01-06 12:33:49 +08:00
    @TheOnly92 5.3.0 出来到现在已经一年半了
    TheOnly92
        24
    TheOnly92  
       2011-01-06 12:43:44 +08:00
    @CupTools 我没说砍得不行,只是砍掉了代码就出问题了。

    @Platinum 还是有不少问题吧
    CupTools
        25
    CupTools  
       2011-01-06 14:26:02 +08:00
    @TheOnly92 -.= 那就说明你所使用的函数PHP官方看着不爽
    ayanamist
        26
    ayanamist  
       2011-01-06 21:02:11 +08:00
    CupTools
        27
    CupTools  
       2011-01-07 13:39:41 +08:00
    @ayanamist 看unset这个function没有,你要用xdebug自己看。
    ayanamist
        28
    ayanamist  
       2011-01-07 14:41:27 +08:00
    @CupTools 看来你没看到我发的链接的点子上。那个评论说了,确实有的时候unset是没有用的,要自己设NULL改写内存。不过PHP的内存控制一直很不好。我现在已经转向Python开发了
    CupTools
        29
    CupTools  
       2011-01-08 09:47:49 +08:00
    @ayanamist 5.3表示没有鸭梨了
    ayanamist
        30
    ayanamist  
       2011-01-08 09:59:42 +08:00
    @CupTools 表示Zend Optimizer这个东西只能跑在5.2下面……
    CupTools
        31
    CupTools  
       2011-01-08 10:41:33 +08:00
    @ayanamist 表示连EA, xCache,ZO都不跑的飘过。。纯裸跑
    TheOnly92
        32
    TheOnly92  
       2011-01-08 11:19:21 +08:00
    5.3 集合了 APC 吧。
    ayanamist
        33
    ayanamist  
       2011-01-08 12:11:02 +08:00
    @CupTools Zend Encoder对商业公司很重要。OP cache性能提升很明显,当然你要会利用特性。裸跑很牛逼,你果然不愧我之前对你的称谓
    ayanamist
        34
    ayanamist  
       2011-01-08 12:11:26 +08:00
    @TheOnly92 没有吧……EAC,APC, XC之类的东西还是要自己装
    CupTools
        35
    CupTools  
       2011-01-08 16:16:07 +08:00
    @ayanamist 你给我什么称谓了.... Encoder?现在有ionCube。OP这些太垃圾
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2848 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 14:30 PVG 22:30 LAX 06:30 JFK 09:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86