V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
iloveyou
V2EX  ›  问与答

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

  •  
  •   iloveyou · 2011-01-05 16:52:38 +08:00 · 5408 次点击
    这是一个创建于 5070 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这种新建类的实例可以这样:
    $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   ·   实用小工具   ·   2742 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 05:43 · PVG 13:43 · LAX 21:43 · JFK 00:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.