PHP 8.4.3 Released!

预定义类

本节列出标准的预定义类。各种扩展库定义了其它类,其说明在各自的参考文档中。

标准类

这些类由一些内建在 PHP 中的标准函数定义。

Directory
dir() 创建。
stdClass
使用类型转换为对象或者各种标准函数创建的通用空类。
__PHP_Incomplete_Class
可能由 unserialize() 创建。
Exception
ErrorException
php_user_filter
Closure
预定义的 final 类 Closure,它可以用于实现 匿名函数
Generator
预定义的 final 类 Generator,它可以用于实现 生成器
ArithmeticError
AssertionError
DivisionByZeroError
Error
Throwable
ParseError
TypeError

特殊的类

以下这些标识符由于它们有特殊的用处,因此不可作为类名

self
当前类
static
运行时的当前类
parent
父级类
添加备注

用户贡献的备注 6 notes

up
22
spark at limao dot com dot br
13 years ago
if you want a Dynamic class you can extend from, add atributes AND methods on the fly you can use this:
<?php
class Dynamic extends stdClass{
public function
__call($key,$params){
if(!isset(
$this->{$key})) throw new Exception("Call to undefined method ".get_class($this)."::".$key."()");
$subject = $this->{$key};
call_user_func_array($subject,$params);
}
}
?>

this will accept both arrays, strings and Closures:
<?php
$dynamic
->myMethod = "thatFunction";
$dynamic->hisMethod = array($instance,"aMethod");
$dynamic->newMethod = array(SomeClass,"staticMethod");
$dynamic->anotherMethod = function(){
echo
"Hey there";
};
?>

then call them away =D
up
18
wyattstorch42 at outlook dot com
11 years ago
If you call var_export() on an instance of stdClass, it attempts to export it using ::__set_state(), which, for some reason, is not implemented in stdClass.

However, casting an associative array to an object usually produces the same effect (at least, it does in my case). So I wrote an improved_var_export() function to convert instances of stdClass to (object) array () calls. If you choose to export objects of any other class, I'd advise you to implement ::__set_state().

<?php
/**
* An implementation of var_export() that is compatible with instances
* of stdClass.
* @param mixed $variable The variable you want to export
* @param bool $return If used and set to true, improved_var_export()
* will return the variable representation instead of outputting it.
* @return mixed|null Returns the variable representation when the
* return parameter is used and evaluates to TRUE. Otherwise, this
* function will return NULL.
*/
function improved_var_export ($variable, $return = false) {
if (
$variable instanceof stdClass) {
$result = '(object) '.improved_var_export(get_object_vars($variable), true);
} else if (
is_array($variable)) {
$array = array ();
foreach (
$variable as $key => $value) {
$array[] = var_export($key, true).' => '.improved_var_export($value, true);
}
$result = 'array ('.implode(', ', $array).')';
} else {
$result = var_export($variable, true);
}

if (!
$return) {
print
$result;
return
null;
} else {
return
$result;
}
}

// Example usage:
$obj = new stdClass;
$obj->test = 'abc';
$obj->other = 6.2;
$obj->arr = array (1, 2, 3);

improved_var_export((object) array (
'prop1' => true,
'prop2' => $obj,
'assocArray' => array (
'apple' => 'good',
'orange' => 'great'
)
));

/* Output:
(object) array ('prop1' => true, 'prop2' => (object) array ('test' => 'abc', 'other' => 6.2, 'arr' => array (0 => 1, 1 => 2, 2 => 3)), 'assocArray' => array ('apple' => 'good', 'orange' => 'great'))
*/
?>

Note: This function spits out a single line of code, which is useful to save in a cache file to include/eval. It isn't formatted for readability. If you want to print a readable version for debugging purposes, then I would suggest print_r() or var_dump().
up
10
xzero at elite7hackers dot net
7 years ago
There comes improved version of amazing snippet posted by (spark at limao dot com dot br) which allows dynamic methods generations and works as versatile extension of StdClass:

This one is faster, optimised for closures, and will work only with closures. Compatible: >= PHP 5.6
<?php

class Dynamic extends \stdClass
{
public function
__call($key, $params)
{
if ( ! isset(
$this->{$key})) {
throw new
Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
}

return
$this->{$key}->__invoke(... $params);
}
}

?>

Usage examples:

<?php
$dynamic
= new Dynamic();
$dynamic->anotherMethod = function () {
echo
"Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return
mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod()
);
?>

This will accept arrays, strings and Closures but is a bit slower due to call_user_func_array
<?php

class Dynamic extends \stdClass
{
public function
__call($key, $params)
{
if ( ! isset(
$this->{$key})) {
throw new
Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
}

return
call_user_func_array($this->{$key}, $params);
}
}

?>

Usage examples:
<?php
$dynamic
= new Dynamic();
$dynamic->myMethod = "thatFunction";
$dynamic->hisMethod = array($dynamic, "randomInt");
$dynamic->newMethod = array(SomeClass, "staticMethod");
$dynamic->anotherMethod = function () {
echo
"Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return
mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod(),
$dynamic->hisMethod()
);

?>
up
6
unknown
22 years ago
It's handy to have a array of the reserved classes.....
var_dump (get_declared_classes ());
up
2
xzero at elite7hackers dot net
7 years ago
There comes improved version of amazing snippet posted by which allows dynamic methods generations and works as versatile extension of StdClass:

This one is faster, optimised for closures, and will work only with closures. Compatible: >= PHP 5.6
<?php

class Dynamic extends \stdClass
{
public function
__call($key, $params)
{
if ( ! isset(
$this->{$key})) {
throw new
Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
}

return
$this->{$key}->__invoke(... $params);
}
}

?>

Usage examples:

<?php
$dynamic
= new Dynamic();
$dynamic->anotherMethod = function () {
echo
"Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return
mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod()
);
?>

This will accept arrays, strings and Closures but is a bit slower due to call_user_func_array
<?php

class Dynamic extends \stdClass
{
public function
__call($key, $params)
{
if ( ! isset(
$this->{$key})) {
throw new
Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
}

return
call_user_func_array($this->{$key}, $params);
}
}

?>

Usage examples:
<?php
$dynamic
= new Dynamic();
$dynamic->myMethod = "thatFunction";
$dynamic->hisMethod = array($dynamic, "randomInt");
$dynamic->newMethod = array(SomeClass, "staticMethod");
$dynamic->anotherMethod = function () {
echo
"Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return
mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod(),
$dynamic->hisMethod()
);

?>
up
3
Ashley Dambra
10 years ago
Here a simple class that allow to set anonymous function. It's an optimised class of stdClass.

<?php
class stdObject {
public function
__construct(array $arguments = array()) {
if (!empty(
$arguments)) {
foreach (
$arguments as $property => $argument) {
if (
$argument instanceOf Closure) {
$this->{$property} = $argument;
} else {
$this->{$property} = $argument;
}
}
}
}

public function
__call($method, $arguments) {
if (isset(
$this->{$method}) && is_callable($this->{$method})) {
return
call_user_func_array($this->{$method}, $arguments);
} else {
throw new
Exception("Fatal error: Call to undefined method stdObject::{$method}()");
}
}
}

$person = new stdObject(array(
"name" => "nick",
"age" => 23,
"friends" => array("frank", "sally", "aaron"),
"sayHi" => function() {
return
"Hello there";
}
));

$person->sayHi2 = function() {
return
"Hello there 2";
};

$person->test = function() {
return
"test";
};

var_dump($person->name, $person->test(), $person->sayHi2());
?>
To Top