Install via yarn add locutus and import:
import { is_callable } from 'locutus/php/var/is_callable'.
Or with CommonJS: const { is_callable } = require('locutus/php/var/is_callable')
Use a bundler that supports tree-shaking so you only ship the functions you actually use.
Vite,
webpack,
Rollup, and
Parcel
all handle this. For server-side use this is less of a concern.
Examples
These examples are extracted from test cases that automatically verify our functions against their native counterparts.
#
code
expected result
1
is_callable('is_callable')
true
2
is_callable('bogusFunction', true)
true // gives true because does not do strict checking
3
function SomeClass () {}
SomeClass.prototype.someMethod = function (){}
var testObj = new SomeClass()
is_callable([testObj, 'someMethod'], true, 'myVar')
var $result = myVar
'SomeClass::someMethod'
4
is_callable(function () {})
true
5
is_callable(class MyClass {})
false
Notes
The variable callableName cannot work as a string variable passed by
reference as in PHP (since JavaScript does not support passing
strings by reference), but instead will take the name of
a global variable and set that instead.
When used on an object, depends on a constructor property
being kept on the object prototype
Depending on the callableName that is passed, this function can use eval.
The eval input is however checked to only allow valid function names,
So it should not be unsafer than uses without eval (seeing as you can)
already pass any function to be executed here.
Dependencies
This function uses the following Locutus functions:
exportfunctionis_callable(mixedVar: CallableValue, syntaxOnly?: boolean, callableName?: string): boolean { // discuss at: https://locutus.io/php/is_callable/ // original by: Brett Zamir (https://brett-zamir.me) // input by: François // improved by: Brett Zamir (https://brett-zamir.me) // improved by: KnightYoshi // improved by: Waldo Malqui Silva (https://fayr.us/waldo/) // note 1: The variable callableName cannot work as a string variable passed by // note 1: reference as in PHP (since JavaScript does not support passing // note 1: strings by reference), but instead will take the name of // note 1: a global variable and set that instead. // note 1: When used on an object, depends on a constructor property // note 1: being kept on the object prototype // note 2: Depending on the `callableName` that is passed, this function can use eval. // note 2: The eval input is however checked to only allow valid function names, // note 2: So it should not be unsafer than uses without eval (seeing as you can) // note 2: already pass any function to be executed here. // example 1: is_callable('is_callable') // returns 1: true // example 2: is_callable('bogusFunction', true) // returns 2: true // gives true because does not do strict checking // example 3: function SomeClass () {} // example 3: SomeClass.prototype.someMethod = function (){} // example 3: var testObj = new SomeClass() // example 3: is_callable([testObj, 'someMethod'], true, 'myVar') // example 3: var $result = myVar // returns 3: 'SomeClass::someMethod' // example 4: is_callable(function () {}) // returns 4: true // example 5: is_callable(class MyClass {}) // returns 5: false
exportfunctionis_callable(mixedVar, syntaxOnly, callableName) { // discuss at: https://locutus.io/php/is_callable/ // original by: Brett Zamir (https://brett-zamir.me) // input by: François // improved by: Brett Zamir (https://brett-zamir.me) // improved by: KnightYoshi // improved by: Waldo Malqui Silva (https://fayr.us/waldo/) // note 1: The variable callableName cannot work as a string variable passed by // note 1: reference as in PHP (since JavaScript does not support passing // note 1: strings by reference), but instead will take the name of // note 1: a global variable and set that instead. // note 1: When used on an object, depends on a constructor property // note 1: being kept on the object prototype // note 2: Depending on the `callableName` that is passed, this function can use eval. // note 2: The eval input is however checked to only allow valid function names, // note 2: So it should not be unsafer than uses without eval (seeing as you can) // note 2: already pass any function to be executed here. // example 1: is_callable('is_callable') // returns 1: true // example 2: is_callable('bogusFunction', true) // returns 2: true // gives true because does not do strict checking // example 3: function SomeClass () {} // example 3: SomeClass.prototype.someMethod = function (){} // example 3: var testObj = new SomeClass() // example 3: is_callable([testObj, 'someMethod'], true, 'myVar') // example 3: var $result = myVar // returns 3: 'SomeClass::someMethod' // example 4: is_callable(function () {}) // returns 4: true // example 5: is_callable(class MyClass {}) // returns 5: false
// php/var/is_callable (target function module) typeCallableValue = PhpRuntimeValue
functionis_callable(mixedVar: CallableValue, syntaxOnly?: boolean, callableName?: string): boolean { // discuss at: https://locutus.io/php/is_callable/ // original by: Brett Zamir (https://brett-zamir.me) // input by: François // improved by: Brett Zamir (https://brett-zamir.me) // improved by: KnightYoshi // improved by: Waldo Malqui Silva (https://fayr.us/waldo/) // note 1: The variable callableName cannot work as a string variable passed by // note 1: reference as in PHP (since JavaScript does not support passing // note 1: strings by reference), but instead will take the name of // note 1: a global variable and set that instead. // note 1: When used on an object, depends on a constructor property // note 1: being kept on the object prototype // note 2: Depending on the `callableName` that is passed, this function can use eval. // note 2: The eval input is however checked to only allow valid function names, // note 2: So it should not be unsafer than uses without eval (seeing as you can) // note 2: already pass any function to be executed here. // example 1: is_callable('is_callable') // returns 1: true // example 2: is_callable('bogusFunction', true) // returns 2: true // gives true because does not do strict checking // example 3: function SomeClass () {} // example 3: SomeClass.prototype.someMethod = function (){} // example 3: var testObj = new SomeClass() // example 3: is_callable([testObj, 'someMethod'], true, 'myVar') // example 3: var $result = myVar // returns 3: 'SomeClass::someMethod' // example 4: is_callable(function () {}) // returns 4: true // example 5: is_callable(class MyClass {}) // returns 5: false
functiongetPhpObjectEntry(value, key) { if ((typeof value !== 'object' && typeof value !== 'function') || value === null) { returnundefined }
let current = value while (current) { const descriptor = Object.getOwnPropertyDescriptor(current, key) if (descriptor) { if (typeof descriptor.get === 'function') { const getterValue = descriptor.get.call(value) returntypeof getterValue === 'undefined' ? undefined : getterValue } const directValue = descriptor.value returntypeof directValue === 'undefined' ? undefined : directValue } current = Object.getPrototypeOf(current) }
returnundefined }
// php/var/is_callable (target function module) functionis_callable(mixedVar, syntaxOnly, callableName) { // discuss at: https://locutus.io/php/is_callable/ // original by: Brett Zamir (https://brett-zamir.me) // input by: François // improved by: Brett Zamir (https://brett-zamir.me) // improved by: KnightYoshi // improved by: Waldo Malqui Silva (https://fayr.us/waldo/) // note 1: The variable callableName cannot work as a string variable passed by // note 1: reference as in PHP (since JavaScript does not support passing // note 1: strings by reference), but instead will take the name of // note 1: a global variable and set that instead. // note 1: When used on an object, depends on a constructor property // note 1: being kept on the object prototype // note 2: Depending on the `callableName` that is passed, this function can use eval. // note 2: The eval input is however checked to only allow valid function names, // note 2: So it should not be unsafer than uses without eval (seeing as you can) // note 2: already pass any function to be executed here. // example 1: is_callable('is_callable') // returns 1: true // example 2: is_callable('bogusFunction', true) // returns 2: true // gives true because does not do strict checking // example 3: function SomeClass () {} // example 3: SomeClass.prototype.someMethod = function (){} // example 3: var testObj = new SomeClass() // example 3: is_callable([testObj, 'someMethod'], true, 'myVar') // example 3: var $result = myVar // returns 3: 'SomeClass::someMethod' // example 4: is_callable(function () {}) // returns 4: true // example 5: is_callable(class MyClass {}) // returns 5: false
// validFunctionName avoids exploits // biome-ignore lint/security/noGlobalEval: needed for PHP port if (validFunctionName && typeofeval(method) === 'function') { if (callableName) { setPhpGlobalEntry(callableName, name) } returntrue }
returnfalse }
Improve this function
Locutus is a community effort following
The McDonald's Theory:
we ship first iterations, hoping others will improve them.
If you see something that could be better, we'd love your contribution.