PHP在验证之前检测它是常量还是字符串

PHP在验证之前检测它是常量还是字符串,php,variables,constants,Php,Variables,Constants,我正在开发一个函数来验证变量和常量 function checkVars($var){ if(isConstant($var)){ <--here is my problem, how do I check if its a Constant and or a string? return defined($var); }else{ //use other functions to check if its a valid variable } } 这只是一个示例,但您可以

我正在开发一个函数来验证变量和常量

function checkVars($var){
 if(isConstant($var)){ <--here is my problem, how do I check if its a Constant and or a string?
  return defined($var);
 }else{
  //use other functions to check if its a valid variable
 }
}
这只是一个示例,但您可以使用4行代码来验证常量或变量,以满足特定的应用程序需要

其思想是通过一个返回true或false的函数调用保存所有工作:

if(isValid('CONS')){
 //do stuff on true
}else{
 //do stuff on false
}
您将使用来测试常量是否存在并已定义。然后使用with确定常量是否为字符串。我假设您使用的是
return
,因为此条件是函数的一部分:

if(defined($constantName) and is_string(constant($constantName))) {
    return constant($constantName);
} else {
    // other code
}
运行以下测试时,我可以看到返回了“bar”:

define("FOO", "bar");
$constantName = "FOO";

if(defined($constantName) and is_string(constant($constantName))) {
    echo constant($constantName); // 'bar'
} else {
    // other code
}
您将使用来测试常量是否存在并已定义。然后使用with确定常量是否为字符串。我假设您使用的是
return
,因为此条件是函数的一部分:

if(defined($constantName) and is_string(constant($constantName))) {
    return constant($constantName);
} else {
    // other code
}
运行以下测试时,我可以看到返回了“bar”:

define("FOO", "bar");
$constantName = "FOO";

if(defined($constantName) and is_string(constant($constantName))) {
    echo constant($constantName); // 'bar'
} else {
    // other code
}

检查常量是否由其名称定义:

defined('CONSTANT');
检查任何值是否为字符串:

is_string(CONSTANT);
从逻辑上讲,如果它不是一个常量,那么它就是一个字符串

要检查是否为常量,必须以字符串形式传递常量名称。 您还可以使用
get_defined_constants()
检查是否存在具有相同值的常量,但您将不知道是否存在相同的常量

define('MYCONST', "THE VALUE");
function exists_a_constant($value)
{
    $constants = get_defined_constants(true);
    return in_array($value, $constants['user']); // true if finds or false if not
    // return array_search($value, $constants['user']);    //Will return the key (name of the constant)
}

function checkVars($var)
{
    if (exists_a_constant($var)) {
        echo "exists a constant";
    } else {
        echo "not";
    }
}

checkVars(MYCONST);
// exists a constant
checkVars('MYCONST');
// not
checkVars("THE VALUE");
// exists a constant
checkVars("random string");
// not

检查常量是否由其名称定义:

defined('CONSTANT');
检查任何值是否为字符串:

is_string(CONSTANT);
从逻辑上讲,如果它不是一个常量,那么它就是一个字符串

要检查是否为常量,必须以字符串形式传递常量名称。 您还可以使用
get_defined_constants()
检查是否存在具有相同值的常量,但您将不知道是否存在相同的常量

define('MYCONST', "THE VALUE");
function exists_a_constant($value)
{
    $constants = get_defined_constants(true);
    return in_array($value, $constants['user']); // true if finds or false if not
    // return array_search($value, $constants['user']);    //Will return the key (name of the constant)
}

function checkVars($var)
{
    if (exists_a_constant($var)) {
        echo "exists a constant";
    } else {
        echo "not";
    }
}

checkVars(MYCONST);
// exists a constant
checkVars('MYCONST');
// not
checkVars("THE VALUE");
// exists a constant
checkVars("random string");
// not

根据安德烈·沃克的回答,我做了一些修改,效果很好

get_defined_constants获取一个包含所有已定义常量的数组,然后我使用array_key_exists检查您传递的常量是否在数组中

define('FOO','bar');
function exists_a_constant($value){
    $constants = get_defined_constants();
    return array_key_exists($value,$constants); 
}

if(exists_a_constant('FOO')){
    echo 'defined';
}else{
    echo 'not defined';
}

谢谢

根据安德烈·沃克的回答,我做了一些修改,效果不错

get_defined_constants获取一个包含所有已定义常量的数组,然后我使用array_key_exists检查您传递的常量是否在数组中

define('FOO','bar');
function exists_a_constant($value){
    $constants = get_defined_constants();
    return array_key_exists($value,$constants); 
}

if(exists_a_constant('FOO')){
    echo 'defined';
}else{
    echo 'not defined';
}


谢谢

is_string()
在这里不适用于您?我认为您无法检查值是否为常量。如果传入一个常量,它将是该常量的值。除非传入的值是常量本身的名称。请提供一个示例,说明如何调用此函数,以及希望它返回什么。@a您可以测试是否定义了
的常量(常量的名称)
,并且可以使用
常量(常量的名称)检查常量的值
@JayBlanchard谢谢。今天学到了一些新东西:-D
is_string()
在这里不适用于您?我认为您无法检查值是否为常量。如果传入一个常量,它将是该常量的值。除非传入的值是常量本身的名称。请提供一个示例,说明如何调用此函数,以及希望它返回什么。@a您可以测试是否定义了
的常量(常量的名称)
,并且可以使用
常量(常量的名称)检查常量的值
@JayBlanchard谢谢。今天学到了一些新东西:-即使未定义常量,DIt也返回TRUE我忘记了仅使用用户定义的常量。更新了答案@CrashOverride正在工作。仍然不工作,但我更改了数组搜索,因为数组存在并且工作正常。添加它作为答案,谢谢你的帮助。在这里用于检查值
array\u key\u exists()
将搜索该键。如果您正在接收密钥,您可以通过
defined('MYCONSTNAME')
进行检查。即使未定义常量,它也会返回TRUE。我忘了仅使用用户定义的常量。更新了答案@CrashOverride正在工作。仍然不工作,但我更改了数组搜索,因为数组存在并且工作正常。添加它作为答案,谢谢你的帮助。在这里用于检查值
array\u key\u exists()
将搜索该键。如果您正在接收密钥,您可以通过
defined('MYCONSTNAME')
进行检查。我猜您的问题有误导性/混淆性。这与检查变量是否为字符串无关,而只是检查该常量是否已定义。我猜您的问题有误导性/混淆性。这与检查变量是否为字符串无关,而只是检查该常量是否已定义。