2009-12-26 85 views
1

我正在构建自己的框架,并试图将参数传递给静态方法。出于某种原因,该参数未被传递。下面是代码:将参数传递给静态方法使用PHP

Front.php:

if(URI::get(0) === "") 

URI.php:

public static function get($index) 
    { 
     die($index); 
     if(!filter_var($index, FILTER_VALIDATE_INT)) { 
      throw new Exception('You must supply an integer index for the URI segment'); 
     } 

     return self::$uri[$index]; 
    } 

起初我得到一个例外,所以我在模具声明中补充,以确保$ index实际上正确传递。显然这不是因为当脚本退出时,没有任何东西被打印出来供索引使用。

我使用的是PHP 5.3.1。

回答

3

这很奇怪,因为它应该工作;测试的这部分程序后:

class ClassA { 
    public static function a($param) { 
     var_dump($param); 
    } 
} 

ClassA::a(123); 

我得到这样的输出:

int 123 

这表明静态方法确实接收参数(我不明白为什么它不应该,实际上) 。


作为旁注,你用的码本部分结束:

die(0); 

引述手册页exit(这是相同的管芯上)(重点煤矿)

void exit ([ string $status ]) 
void exit (int $status) 

如果status是一个字符串,该函数 在退出之前打印状态。
如果状态是一个整数,那么 值也将用作退出 的状态。
[...]
注意:PHP > = 4.2.0如果是整数,则不会打印状态。

您正在使用PHP 5.3,这是比4.2更新的版本;并在你的情况下,$status是一个整数 - 这意味着它是没有任何显示,与您的代码张贴是完全正常的。


而且,为了完成:如果删除了die,你的代码最终这样做:

if(!filter_var($index, FILTER_VALIDATE_INT)) { 
    throw new Exception('...'); 
} 

随着$index = 0

filter_var返回过滤后的值;使用FILTER_VALIDATE_INT,我想你是过滤得到一个整数 - 而0是整数。

这意味着您致电filter_var将返回0

0被视为false(见Converting to boolean - 所以,你将进入if块;并会抛出异常。


考虑filter_var回报:

  • 过滤后的数据,
  • false当过滤器失效,
  • 0是可以返回一个有效的数据,

您应该使用===运营商(见Comparison Operators,将返回值与false进行比较。这意味着一些代码,应该是这样的:

if(filter_var($index, FILTER_VALIDATE_INT) === false) { 
    throw new Exception('...'); 
} 


希望这有助于!

+0

感谢您的回应,我添加了回声,而不是一个骰子,0被越过...不幸的是,异常是抛出,这意味着它不认为0是一个int。 – adaykin 2009-12-26 20:52:42

+0

Ahh没有看到最后一部分,现在就开始工作,谢谢! – adaykin 2009-12-26 20:55:24

+0

不客气:-)玩得开心! – 2009-12-26 20:58:51