2016-07-14 132 views
0

所以我在我的服务器上运行PHP 5.6,我试图检查一个函数是否存在,当我输入这段代码时。PHP function_exists不工作,并返回false

<?php 

$functionName = 'SalesWeek'; 
if (function_exists($functionName)) { 
$functionName(); 
} else { 
echo "No function exists for ".$functionName."\n"; 
} 

function SalesWeek(){ 
echo "Hello!"; 
} 

我每次运行它都会失败。但是如果我把这个完全相同的代码放在别的东西上,例如phptester.net,它就可以正常工作。我使用codeigniter,所以我想也许它必须这样做,所以我试着改变公共和私人的功能,看看它是否有所作为。有任何想法吗?

+1

“我试着改变公共和私人的功能,看看它是否有所作为”你确定,你不是在谈论一种方法吗?函数(类之外)没有修饰符。 – tkausl

+0

它在一个类的内部,但它的定义与上面我输入的一样。我只是试图把它放在函数之外,然后检查工作,但通话不。即,它表示函数存在,但然后我的调用$ functionName();不起作用。 – CMOS

+0

如果您正在尝试检查@tkausl所说的方法,请选中[method_exists](http://php.net/manual/en/function.method-exists.php)。 – FirstOne

回答

2

function_exists()仅适用于顶级的功能,而不是对象的方法:

<?php 

function foo() { echo "foo\n"; } 
class bar { function baz() { echo "baz in bar\n"; }} 

var_dump(function_exists('foo')); 
var_dump(function_exists('baz')); 

输出:

bool(true)  <--foo 
bool(false) <--baz 

也将用于嵌套函数工作:

function x() { 
    function y() { ... } 
} 
var_dump(function_exists('y')) -> bool(false) 
2

技术上的功能(在野外)不是方法(又名“类中的函数”)。

function_exists()不检查类方法。它只检查你正在使用的命名空间中的函数。

如果你要检查你需要使用一个method_exists类的方法()http://php.net/manual/en/function.method-exists.php

也有是在PHP的顺序读。它是从上到下。因此,在上面的示例中,在您定义代码的最后3行之前,您正在查找的函数不存在。

**下面的例子是不正确的,请参阅编辑**

function_exists('myFunc'); //returns false 

function myFunc(){} 

function_exists('myFunc'); //returns true 

希望这将清除事有点

编辑:

我刚刚发现了一个很奇怪的行为( PHP 5.6)

如果函数在同一个文件中:

<?php 
function_exists('myFunc'); //returns TRUE 

function myFunc(){} 

function_exists('myFunc'); //returns TRUE 

,如果它不是在同一个文件:

<?php 
echo function_exists('myFunc') ;//returns FALSE 
include 'test2.php';//assume myfunc() is defined in this file 
echo function_exists('myFunc');//returns TRUE 

所以我上面的第一答案似乎只是部分正确。 PHP自上而下读取您的代码,但它读取整个文件。所以,如果你在同一个文件中定义你的函数,它将“存在”为PHP。如果它在另一个文件中,则必须先加载/包含该文件。

+1

我做了一些测试并更新了我的答案...... :) –