ReflectionClass::__construct

(PHP 5, PHP 7, PHP 8)

ReflectionClass::__construct构造一个 ReflectionClass

描述

public ReflectionClass::__construct(object|string $objectOrClass)

构造一个新的 ReflectionClass 对象。

参数

objectOrClass

一个包含要反射的类名的 string,或一个 object

错误/异常

如果要反射的类不存在,则抛出 ReflectionException

示例

示例 #1 ReflectionClass 的基本用法

<?php
$reflection
= new ReflectionClass('Exception');
echo
$reflection;
?>

上面的示例将输出类似于

Class [ <internal:Core> class Exception implements Stringable, Throwable ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [7] {
    Property [ protected $message = '' ]
    Property [ private string $string = '' ]
    Property [ protected $code = 0 ]
    Property [ protected string $file = '' ]
    Property [ protected int $line = 0 ]
    Property [ private array $trace = [] ]
    Property [ private ?Throwable $previous = NULL ]
  }

  - Methods [11] {
    Method [ <internal:Core> private method __clone ] {

      - Parameters [0] {
      }
      - Return [ void ]
    }

    Method [ <internal:Core, ctor> public method __construct ] {

      - Parameters [3] {
        Parameter #0 [ <optional> string $message = "" ]
        Parameter #1 [ <optional> int $code = 0 ]
        Parameter #2 [ <optional> ?Throwable $previous = null ]
      }
    }

    Method [ <internal:Core> public method __wakeup ] {

      - Parameters [0] {
      }
      - Tentative return [ void ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getMessage ] {

      - Parameters [0] {
      }
      - Return [ string ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getCode ] {

      - Parameters [0] {
      }
    }

    Method [ <internal:Core, prototype Throwable> final public method getFile ] {

      - Parameters [0] {
      }
      - Return [ string ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getLine ] {

      - Parameters [0] {
      }
      - Return [ int ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getTrace ] {

      - Parameters [0] {
      }
      - Return [ array ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getPrevious ] {

      - Parameters [0] {
      }
      - Return [ ?Throwable ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getTraceAsString ] {

      - Parameters [0] {
      }
      - Return [ string ]
    }

    Method [ <internal:Core, prototype Stringable> public method __toString ] {

      - Parameters [0] {
      }
      - Return [ string ]
    }
  }
}

参见

添加笔记

用户贡献笔记 6 条笔记

danbettles at yahoo dot co dot uk
9 年前
要在 PHP 5.3 中反射命名空间类,您必须始终指定类的完全限定名 - 即使您使用“use”语句为包含的命名空间创建了别名。

因此,您不需要

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('Core\Singleton');
?>

您将键入

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('App\Core\Singleton');
?>
me [at] klay [dot] me
10 年前
用法示例

public static function getClassData($class)
{
// 尝试创建 ReflectionClass 类的新对象
$class = new ReflectionClass($class);

$details = sprintf('%s - %s%s%s%s%s%s%s%s',
$class->getName(),
$class->isInternal() ? '内部类,' : '用户定义的类,'
$class->isTrait() ? '是特征,' : '',
$class->isInterface() ? '是接口,' : '',
$class->isAbstract() ? '是抽象类,' : '',
$class->isFinal() ? '是最终类,' : '',
$class->isCloneable() ? '是可克隆类,' : '',
$class->isInstantiable() ? '是可实例化的,' : '',
$class->isIterateable() ? '是可迭代的:''
);

return '<pre class="debug">' . rtrim($details, ',') . '</pre>';
}
gafisher at griasolutions dot com
12 年前
在 Windows Vista (我知道,我知道) 上运行以下代码,PHP 5.3.9,当无法实例化所需的类时,ReflectionClass 构造函数实际上会抛出 ReflectionException

<?php
try {
$ReflectedClass = new ReflectionClass('NonExist');
} catch (
LogicException $Exception) {
die(
'不会到这里...');
} catch (
ReflectionException $Exception) {
die(
'您的类不存在!');
}
?>
ivo at jansch dot nl
14 年前
了解到您还可以使用 ReflectionClass 检查接口非常有用,即使接口不是类。示例

<?php

interface Edible
{
public function
eat();
}

$refl = new ReflectionClass("Edible");
$methods = $refl->getMethods();
?>

[由 danbrown AT php DOT net 编辑 - 包含由 (dbl AT bnet DOT com) 在 2010-08-18 修复的错误,并附带以下消息:“下划线必须删除才能使其工作 (new Reflection_Class -> new ReflectionClass)"]
cspray at gmail dot com
13 年前
了解到如果您将字符串传入构造函数,而由于某种原因无法实例化类,则会抛出 SPL LogicException 非常有用。

此代码在 Mac OS X 10.6.7、AMP、PHP 5.3+ 上运行

<?php

// index.php
try {
$ReflectedClass = new ReflectionClass('NonExist');
} catch (
LogicException $logicDuh) {
print_r($logicDuh);
}

?>

将返回一个关于错误的深层嵌套数组,其中包含有用的信息。
nulled
10 年前
if (is_file($classfile))
require_once $classfile;

if (! class_exists($classname, false))
exit('ERROR: ' . $classname . ' 未定义为类');

上面的代码可用于判断类是否已定义。您也可以使用另一个评论者的方法使用 Try Catch 异常。但是,如果您不太使用 try 块,则上面的基于函数的方法也能正常工作。

从那里,您可以调用

$class = new ReflectionClass($classname);

if (! $class->isSubclassOf('PanelCommon'))
exit("ERROR: {$classname} 必须扩展 PanelCommon");

if (! $class->isUserDefined())
exit("ERROR: {$classname} 必须是用户定义的,而不是 PHP 内部类");

if (! $class->IsInstantiable())
exit("ERROR: {$classname} 必须是可实例化的,而不是接口或抽象类");

if (! $class->hasMethod('home'))
exit("ERROR: {$classname} 缺少必需的方法/函数 home()");

等等。
To Top