iloveyou
V2EX  ›  问与答

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

  •  
  •   iloveyou · Jan 5, 2011 · 6503 views
    This topic created in 5788 days ago, the information mentioned may be changed or developed.
    这种新建类的实例可以这样:
    $className = '未知类名称';
    $newClass = new $className;

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

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

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

    示例:
    $className = '未知类名称';
    $className :: parameter = 'test'; //这行报错。
    fmfsaisai
    fmfsaisai
    Jan 5, 2011
    4
    $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
    iloveyou
    OP
    Jan 5, 2011
    5
    @fmfsaisai 我用的是php-5.2.9-2,确实不行,后来我用了eval方法:

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

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

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

    @Platinum 还是有不少问题吧
    CupTools
    CupTools
    Jan 6, 2011
    25
    @TheOnly92 -.= 那就说明你所使用的函数PHP官方看着不爽
    CupTools
    CupTools
    Jan 7, 2011
    27
    @ayanamist 看unset这个function没有,你要用xdebug自己看。
    ayanamist
    ayanamist
    Jan 7, 2011
    28
    @CupTools 看来你没看到我发的链接的点子上。那个评论说了,确实有的时候unset是没有用的,要自己设NULL改写内存。不过PHP的内存控制一直很不好。我现在已经转向Python开发了
    CupTools
    CupTools
    Jan 8, 2011
    29
    @ayanamist 5.3表示没有鸭梨了
    ayanamist
    ayanamist
    Jan 8, 2011
    30
    @CupTools 表示Zend Optimizer这个东西只能跑在5.2下面……
    CupTools
    CupTools
    Jan 8, 2011
    31
    @ayanamist 表示连EA, xCache,ZO都不跑的飘过。。纯裸跑
    TheOnly92
    TheOnly92
    Jan 8, 2011
    32
    5.3 集合了 APC 吧。
    ayanamist
    ayanamist
    Jan 8, 2011
    33
    @CupTools Zend Encoder对商业公司很重要。OP cache性能提升很明显,当然你要会利用特性。裸跑很牛逼,你果然不愧我之前对你的称谓
    ayanamist
    ayanamist
    Jan 8, 2011
    34
    @TheOnly92 没有吧……EAC,APC, XC之类的东西还是要自己装
    CupTools
    CupTools
    Jan 8, 2011
    35
    @ayanamist 你给我什么称谓了.... Encoder?现在有ionCube。OP这些太垃圾
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4794 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 01:53 · PVG 09:53 · LAX 17:53 · JFK 20:53
    ♥ Do have faith in what you're doing.