求个详细的php反射类的介绍

十一文 发布于 2012/06/26 11:14
阅读 1K+
收藏 0
PHP

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

http://cn.php.net/manual/zh/reflectionclass.construct.php

 

 

ReflectionClass::__construct 


Warning

本函数还未编写文档,仅有参数列表。

我用它返回了一个'ReflectionException' with message 'Class does not exist'


可我的类是存在的。因为我用get_class 成功返回了类名

加载中
0
宏哥
宏哥

引用来自“十一文”的答案

引用来自“龙上”的答案

class Product
{
    public $name;
    public $price;
    private $test;
    public static $a;
    private static $b;
    protected static $c;
    
    function __construct ( $name, $price )
    {
        $this->name = $name;
        $this->price = $price;
    }
    
    private function test(){}
}

//Reflection //为类的摘要信息提供静态函数[b]exprot()[/b]

$prod_class = new ReflectionClass('Product');//类信息和工具
echo "<pre>";
Reflection::export( $prod_class );
echo "</pre>";

$prod_class new ReflectionClass('Product');//类信息和工具



我在这里出错了。

我的代码大致是这样的

$class_name = get_class($obj); //这里没问题获取到的class——name也对

$prod_class new ReflectionClass('$class_name');//这里就报错了

单引号去掉
十一文
十一文
汗 是我打错了。没单引号的 悲剧
0
十一文
十一文

引用来自“龙上”的答案

class Product
{
    public $name;
    public $price;
    private $test;
    public static $a;
    private static $b;
    protected static $c;
    
    function __construct ( $name, $price )
    {
        $this->name = $name;
        $this->price = $price;
    }
    
    private function test(){}
}

//Reflection //为类的摘要信息提供静态函数[b]exprot()[/b]

$prod_class = new ReflectionClass('Product');//类信息和工具
echo "<pre>";
Reflection::export( $prod_class );
echo "</pre>";

$prod_class new ReflectionClass('Product');//类信息和工具



我在这里出错了。

我的代码大致是这样的

$class_name = get_class($obj); //这里没问题获取到的class——name也对

$prod_class new ReflectionClass($class_name);//这里就报错了

ValueError
ValueError
难道是命名空间问题?
deleted
deleted
单引号不解析变量的.....
0
龙上
龙上
class Product
{
    public $name;
    public $price;
    private $test;
    public static $a;
    private static $b;
    protected static $c;
    
    function __construct ( $name, $price )
    {
        $this->name = $name;
        $this->price = $price;
    }
    
    private function test(){}
}

//Reflection //为类的摘要信息提供静态函数[b]exprot()[/b]

$prod_class = new ReflectionClass('Product');//类信息和工具
echo "<pre>";
Reflection::export( $prod_class );
echo "</pre>";

0
龙上
龙上
class Product
{
    public $name;
    public $price;
    private $test;
    public static $a;
    private static $b;
    protected static $c;
    
    function __construct ( $name, $price )
    {
        $this->name = $name;
        $this->price = $price;
    }
    
    private function test(){}
}

//Reflection //为类的摘要信息提供静态函数[b]exprot()[/b]

$prod_class = new ReflectionClass('Product');//类信息和工具
echo "<pre>";
Reflection::export( $prod_class );
echo "</pre>";

function classData ( ReflectionClass $class )
{
 $details = '';
 $name = $class->getName();
 if ( $class->isUserDefined() )
 {
  $details .= "$name 是用户定义的 <br />";
 }
 if ( $class->isInternal() )
 {
  $details .= "$name is built-in <br />";
 }
 if( $class->isInterface() )
 {
  $details .= "$name 是一个借口 <br />";
 }
 if ( $class->isAbstract() )
 {
  $details .= "$name 是抽象类 <br />";
 }
 if ( $class->isFinal() )
 {
  $details .= "$name 不能够被继承 <br />";
 }
 if ( $class->isInstantiable() )
 {
  $details .= "$name 可以北实例化 <br />";
 } else {
  $details .= "$name 不能北实例化 <br />";
 }
 return $details;
}function classData ( ReflectionClass $class )
{
 $details = '';
 $name = $class->getName();
 if ( $class->isUserDefined() )
 {
  $details .= "$name 是用户定义的 <br />";
 }
 if ( $class->isInternal() )
 {
  $details .= "$name is built-in <br />";
 }
 if( $class->isInterface() )
 {
  $details .= "$name 是一个借口 <br />";
 }
 if ( $class->isAbstract() )
 {
  $details .= "$name 是抽象类 <br />";
 }
 if ( $class->isFinal() )
 {
  $details .= "$name 不能够被继承 <br />";
 }
 if ( $class->isInstantiable() )
 {
  $details .= "$name 可以北实例化 <br />";
 } else {
  $details .= "$name 不能北实例化 <br />";
 }
 return $details;
}
$prod_class = new ReflectionClass('Product');
print classData($prod_class);

 

获取类的源代码

class ReflectionUtil 
{
 static function getClassSource ( ReflectionClass $class )
 {
  $path = $class->getFileName();
  $lines = @file( $path );
  $from = $class->getStartLine();
  $to = $class->getEndLine();
  $len = $to-$from+1;
  return implode( array_slice( $lines, $from-1, $len) );
 } 
}
function p($a)
{
 echo "<pre>";
 echo $a;
 echo "</pre>";
}
$s = ReflectionUtil::getClassSource( $prod_class );
p($s);

0
宏哥
宏哥
所以说,你这样的小伙子就应该骂.难怪一个月的工作量,要5-6个月
/**
 * Simple class loading for all classes
 */
if (!defined('APP_CLASS_EXT')) define('APP_CLASS_EXT','php');
function app_class_load($class){
        //$path = __DIR__. str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';
        $class = strtolower($class);
        $class_path = __DIR__.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR. str_replace('_', DIRECTORY_SEPARATOR, $class);
        $path = $class_path.'.'.APP_CLASS_EXT;
        if(!file_exists($path)){
                return false;
        }else{
                require_once $path;
                return true;
        }
        return false;
}
spl_autoload_register('app_class_load');

宏哥
宏哥
@宏哥 class not found 不是文件的原因,是类定义无法找到
十一文
十一文
真的加载成功了。不是类文件不存在的缘故 。
宏哥
宏哥
回复 @十一文 : 再回去想想, 真的加载成功了?
十一文
十一文
你这个是自动加载所有的类。不是我所想要的啦。我的类已经加载了。否则我get_class($obj) 这个obj从哪里来的了。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部