PHP's get_defined_functions in TypeScript

✓ Verified: PHP 8.3
Examples tested against actual runtime. CI re-verifies continuously. Only documented examples are tested.

How to use

Install via yarn add locutus and import: import { get_defined_functions } from 'locutus/php/funchand/get_defined_functions'.

Or with CommonJS: const { get_defined_functions } = require('locutus/php/funchand/get_defined_functions')

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.

#codeexpected result
1var $funcs = get_defined_functions() var $result = Array.isArray($funcs) && $funcs.length > 0true

Notes

  • Returns an array of global function names. Unlike PHP, JavaScript doesn’t distinguish between user and internal functions.

Dependencies

This function uses the following Locutus functions:

Here's what our current TypeScript equivalent to PHP's get_defined_functions looks like.

import { ensurePhpRuntimeState, getPhpGlobalScope } from '../_helpers/_phpRuntimeState.ts'
import { toPhpArrayObject } from '../_helpers/_phpTypes.ts'

export function get_defined_functions(): string[] {
// discuss at: https://locutus.io/php/get_defined_functions/
// parity verified: PHP 8.3
// original by: Brett Zamir (https://brett-zamir.me)
// improved by: Brett Zamir (https://brett-zamir.me)
// note 1: Returns an array of global function names. Unlike PHP,
// note 1: JavaScript doesn't distinguish between user and internal functions.
// example 1: var $funcs = get_defined_functions()
// example 1: var $result = Array.isArray($funcs) && $funcs.length > 0
// returns 1: true

ensurePhpRuntimeState()

const arr: string[] = []
const already: Record<string, 1> = {}
const globalScope = getPhpGlobalScope()

for (const i in globalScope) {
try {
const topLevelValue = globalScope[i]
if (typeof topLevelValue === 'function') {
if (!already[i]) {
already[i] = 1
arr.push(i)
}
} else if (typeof topLevelValue === 'object' && topLevelValue !== null) {
const nestedObject = toPhpArrayObject(topLevelValue)
for (const j in nestedObject) {
if (typeof nestedObject[j] === 'function' && !already[j]) {
already[j] = 1
arr.push(j)
}
}
}
} catch (_e) {
// Some objects in Firefox throw exceptions when their
// properties are accessed (e.g., sessionStorage)
}
}

return arr
}

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.

View on GitHub · Edit on GitHub · View Raw


« More PHP funchand functions


Star