Как отличить строку от функции в php?

Допустим у меня есть переменная со строкой 'min'. Строка совпадает с именем стандартной функции. Как мне узнать что данные в переменной — именно строка, а не функция? gettype() вернет string (в том числе и для лямбда функций, что меня не устраивает), а is_callable() вернет true (хотя я ожидал бы увидеть false). Помогите пожалуйста.


// v::d это обертка вардампа

$var = create_function('','return false;'); // лямбда функция
v::d(is_callable($var)); // true
v::d(is_string($var)); // true
v::d(is_object($var)); // false
v::d(function_exists($var)); // true

$var2 = 'count'; // по идее строка
v::d(is_callable($var2)); // true
v::d(is_string($var2)); // true
v::d(is_object($var2)); // false
v::d(function_exists($var2)); // true
  • Вопрос задан
  • 2830 просмотров
Пригласить эксперта
Ответы на вопрос 8
@Ents
% cat test.php
<?php
$a = array('function' => function(){}, 'string' => 'sdfsdfds');

foreach ($a as $key => $val) {
echo $key, PHP_EOL;
var_export(is_callable($val));
echo PHP_EOL, PHP_EOL;
}

% php test.php
function
true

string
false
Ответ написан
taliban
@taliban
php программист
А вы не создавайте так фукнции, создавайте по другому:
$var = function(){ return true };
и is_string не сработает.
Иначе вы никак не различите их.
Ответ написан
@Fortop
Tech/Team lead
В общем случае — никак.
Ибо слабая динамическая типизация. И определить вы можете только по контексту использования.

Как варианты, не используйте строки
Используйте, например, www.php.net/manual/en/class.splstring.php
И не используйте строковые анонимные функции у себя в коде, а работайте с php.net/manual/en/class.closure.php
Ответ написан
Комментировать
nazarpc
@nazarpc
Open Source enthusiast
Строка — это строка, а функция — это функция.
Это как отличие дерева от воды.
Другое дело, что текст в строке может совпадать с названием какой-то функции/класса/константы в текущей области видимости, но строка от этого функцией/классом/константой не становится.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
А 'count' — это строка или функция?
is_string — true
is_callable — true.

is_string для лямбды даст false, если в этом вопрос. А определить, является ли строка строкой, а не именем функции можно только по тому, вызывается ли эта строка как функция после.
Ответ написан
@dmitryklerik
Попробуйте function_exists

Для min, count работает, для echo неработает
Ответ написан
forefinger
@forefinger
Как уже предложили используйте Closure:
$var = create_function('','return false;');
var_dump($var, is_string($var));
// string(9) "lambda_1"
// bool(true)
$var = function() {return false;};
var_dump($var, is_string($var));
$var = function() {return false;};
var_dump($var, is_string($var));
// object(Closure)#1 (0) {
// }
// bool(false)


Но при этом:
$var = create_function('','return false;');
var_dump($var, function_exists($var), function_exists(''.$var), function_exists(trim($var)));
// string(9) "lambda_1"
// bool(true)
// bool(true)
// bool(false)
Ответ написан
gaelpa
@gaelpa
Как различить функция в переменной или строка, если в ней находится и функция и строка?
Очевидно, же, что в такой постановке никак вообще. Добавляйте логику более высокого уровня, например рассматривайте функцией только обертку в class MyCallable{__construct($callable)}.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы