【澳门葡京备用网址】PHP基于反射获取一个类中全部的主意,PHP面向对象程序设计类的概念与用法简单示例

正文实例陈诉了php面向对象之反射成效与用法。分享给我们供我们参谋,具体如下:

本文实例陈诉了PHP的反光机制。分享给大家供大家参照他事他说加以考察,具体如下:

正文实例陈述了PHP基于反射获取一个类中享有的不二秘籍。分享给我们供我们参谋,具体如下:

正文实例陈说了PHP面向对象程序设计类的概念与用法。分享给我们供大家参谋,具体如下:

村办对反射定义的掌握:

介绍:

当大家利用三个类时既没有源码也并未有文书档案时(越发是php扩张提供的类,比方mysqli,Redis类),大家该怎么知道那个类中提供了怎么着措施,以及种种方法该怎么使用呢,此时就该PHP中强有力的反光登场了,下边以Redis扩大为例用代码演示:

<?php
class Person {
  private $name;
  private $sex;
  private $age;
  function __construct($name = "", $sex = "男", $age = 22) {
    $this->name = $name;
    $this->sex = $sex;
    $this->age = $age;
  }
  // 直接为私有属性赋值时自动调用,可以屏蔽一些非法赋值
  // 之前有版本可以设置方法为private function __set()
  // The magic method __set() must have public visibility
  // 因为5.35对魔术方法限制的严格了
  public function __set($propertyName, $propertyValue) {
    if ($propertyName == "sex") {
      if (! ($propertyValue == "男" || $propertyValue == "女")) {
        return;
      }
      if ($propertyValue > 150 || $propertyValue < 0) {
        return;
      }
    }
    // 根据传入的成员属性名,赋上相应的值
    $this->$propertyName = $propertyValue;
  }
  // 用来获取私有属性
  public function __get($propertyName) {
    if (isset ( $this->$propertyName )) {
      return ($this->$propertyName);
    } else {
      return (NULL);
    }
  }
  public function __isset($propertyName) {
    if ($propertyName == "name") {
      return false; // 返回假,不允许在对象外部测定这个属性
    }
    return isset ( $this->$propertyName );
  }
  public function __unset($propertyName) {
    if($propertyName=="name") {
      return; //不允许删除name属性
    }
    unset($this->$propertyName);
  }
  function say() {
    echo $this->name . "在说话<br/>";
  }
  function run() {
    echo "在走路·<br/>";
  }
  function __destruct() {
    echo "goodbye" . $this->name . "<br/>";
  }
}
$person1 = new Person ();
$person2 = new Person ( "2" );
$person3 = new Person ( "3" );
// 自动调用了__set()
$person1->name = "张三";
echo $person1->name;
echo "<br/>";
echo $person1->say ();
// 自动调用了__get()
echo $person1->age;
echo "<br/>";
var_dump ( isset ( $person1->name ) );
echo "<br/>";
unset($person1->name);
echo "unset------------>".$person1->name;//name 没有被unset()
echo "<br/>";
$person2 = null;
?>

第一得说说哪些叫反射。对于八个新手来讲,反射这几个概念常常给人一种似懂非懂的
以为,不明白该怎么着出手操作。

PHP5增加了一项新的成效:Reflection。这么些效率使得phper能够reverse-engineer
class, interface,function,method and
extension。通过PHP代码,就足以拿走某object的享有新闻,並且能够和它交互。

<?php
$ref = new ReflectionClass('Redis');
$consts = $ref->getConstants(); //返回所有常量名和值
echo "----------------consts:---------------" . PHP_EOL;
foreach ($consts as $key => $val)
{
  echo "$key : $val" . PHP_EOL;
}
$props = $ref->getDefaultProperties(); //返回类中所有属性
echo "--------------------props:--------------" . PHP_EOL . PHP_EOL;
foreach ($props as $key => $val)
{
  echo "$key : $val" . PHP_EOL;  // 属性名和属性值
}
$methods = $ref->getMethods();   //返回类中所有方法
echo "-----------------methods:---------------" . PHP_EOL . PHP_EOL;
foreach ($methods as $method)
{
  echo $method->getName() . PHP_EOL;
}

结果:

反射是指:指在PHP运市场价格况中,扩充剖判PHP程序,导出或提抽出有关类、方法、属性、参数等的详细消息,同时也包蕴注释。这种动态获取的音信以及动态调用对象的方式的效能称为反射API。反射是决定面向对象范型七月模型的API,其效劳极度强劲,可协助我们营造复杂,可增添的行使。(注意:php中这种反向操作,实在PHP5之后才完全具备

反射是哪些?

回去结果:

张三
张三在说话
22
bool(false)
unset------------>张三
goodbye2
goodbye3
goodbye张三

上边在此笔者用实例举办表达:

它是指在PHP运行情形中,增加分析PHP程序,导出或提收取有关类、方法、属性、参数等的详细消息,包蕴注释。这种动态获取的新闻以及动态调用对象的格局的效果称为反射API。反射是决定面向对象范型相月模型的API,其职能拾分精锐,可支持我们创设复杂,可增加的施用。

----------------consts:---------------
REDIS_NOT_FOUND : 0
REDIS_STRING : 1
REDIS_SET : 2
REDIS_LIST : 3
REDIS_ZSET : 4
REDIS_HASH : 5
ATOMIC : 0
MULTI : 1
PIPELINE : 2
OPT_SERIALIZER : 1
OPT_PREFIX : 2
OPT_READ_TIMEOUT : 3
SERIALIZER_NONE : 0
SERIALIZER_PHP : 1
OPT_SCAN : 4
SCAN_RETRY : 1
SCAN_NORETRY : 0
AFTER : after
BEFORE : before
--------------------props:--------------
-----------------methods:---------------
__construct
__destruct
connect
pconnect
close
ping
echo
get
set
setex
psetex
setnx
getSet
randomKey
renameKey
renameNx
getMultiple
exists
delete
incr
incrBy
incrByFloat
decr
decrBy
type
append
getRange
setRange
getBit
setBit
strlen
getKeys
sort
sortAsc
sortAscAlpha
sortDesc
sortDescAlpha
lPush
rPush
lPushx
rPushx
lPop
rPop
blPop
brPop
lSize
lRemove
listTrim
lGet
lGetRange
lSet
lInsert
sAdd
sSize
sRemove
sMove
sPop
sRandMember
sContains
sMembers
sInter
sInterStore
sUnion
sUnionStore
sDiff
sDiffStore
setTimeout
save
bgSave
lastSave
flushDB
flushAll
dbSize
auth
ttl
pttl
persist
info
resetStat
select
move
bgrewriteaof
slaveof
object
bitop
bitcount
bitpos
mset
msetnx
rpoplpush
brpoplpush
zAdd
zDelete
zRange
zReverseRange
zRangeByScore
zRevRangeByScore
zRangeByLex
zCount
zDeleteRangeByScore
zDeleteRangeByRank
zCard
zScore
zRank
zRevRank
zInter
zUnion
zIncrBy
expireAt
pexpire
pexpireAt
hGet
hSet
hSetNx
hDel
hLen
hKeys
hVals
hGetAll
hExists
hIncrBy
hIncrByFloat
hMset
hMget
multi
discard
exec
pipeline
watch
unwatch
publish
subscribe
psubscribe
unsubscribe
punsubscribe
time
eval
evalsha
script
debug
dump
restore
migrate
getLastError
clearLastError
_prefix
_serialize
_unserialize
client
scan
hscan
zscan
sscan
pfadd
pfcount
pfmerge
getOption
setOption
config
slowlog
rawCommand
getHost
getPort
getDBNum
getTimeout
getReadTimeout
getPersistentID
getAuth
isConnected
getMode
wait
pubsub
open
popen
lLen
sGetMembers
mget
expire
zunionstore
zinterstore
zRemove
zRem
zRemoveRangeByScore
zRemRangeByScore
zRemRangeByRank
zSize
substr
rename
del
keys
lrem
ltrim
lindex
lrange
scard
srem
sismember
zrevrange
sendEcho
evaluate
evaluateSha

愈来愈多关于PHP相关内容感兴趣的读者可查看本站专项论题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总计》、《PHP互连网编制程序本事总计》、《PHP数组(Array)操作手艺大全》、《php字符串(string)用法总计》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

class test{
     private   $A;
     public   $B;
     protected  $C;
     public function test(){
       return "this is a test function";
     }
}
//实例化一个反射类ReflectionClass
$obj=new ReflectionClass('test');
echo $obj."<br>";
//实例化test类,并访问其test方法
$obj2=$obj->newInstance();
echo $obj2->test();

其用途如:自动加载插件,自动生成文档,以至可用来扩张PHP语言。

更为当大家想要知器具体多个措施怎么利用,有啥参数时,我们能够对这一个点子开展更为的反光,以上例中的bitpos方法为例(文书档案中并未有介绍该办法的运用)

期待本文所述对咱们PHP程序设计有着帮忙。

村办实例再次回到结果:

php反射api由若干类组成,可协理大家用来拜会程序的元数据如故同有关的讲解交互。借助反射大家能够得到诸如类达成了这几个方法,创建一个类的实例(分歧于用new成立),调用三个艺术(也差别于常规调用),传递参数,动态调用类的静态方法。

echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL;
$reflectMethod = $ref->getMethod('bitpos');  //传入方法名即可
echo $reflectMethod;  // 会调用$reflectMethod->__toString() 返回可打印的形式;

你或者感兴趣的稿子:

  • 澳门葡京备用网址,php类的定义与持续用法实例
  • PHP面向对象程序设计OOP承接用法入门示例
  • PHP面向对象程序设计方法实例详解
  • PHP面向对象程序设计高档个性详解(接口,承袭,抽象类,析构,克隆等)
  • 【澳门葡京备用网址】PHP基于反射获取一个类中全部的主意,PHP面向对象程序设计类的概念与用法简单示例。PHP面向对象程序设计之命名空间与机关加载类详解
  • PHP面向对象程序设计等等与反射API详解
  • PHP面向对象自动加运载飞机制原理与用法剖判
  • PHP入门教程之面向对象的特征解析(继承,多态,接口,抽象类,抽象方法等)
  • PHP入门教程之面向对象基本概念实例解析
  • PHP 面向对象
    final类与final方法
  • PHP面向对象之旅:深切通晓static变量与艺术
  • php面向对象中static静态属性和静态方法的调用
/** * xxx.php * ============================================== * Copy right 2012-2015 * ---------------------------------------------- * This is not a free software, without any authorization is not allowed to use and spread. * ============================================== * @Author:YeXianMing * @Email:LangWaiShiGe@hotmail.com * @Version:zend studio10.6.2 php5.4.38 apache2.2 */ Class [ class test ] { @@ D:\www\MyProjecttest\index5.php 13-21 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [3] { Property [ private $A ] Property [ public $B ] Property [ protected $C ] } - Methods [1] { Method [ public method test ] { @@ D:\www\MyProjecttest\index5.php 18 - 20 } } }
this is a test function

反射api是php内建的oop技巧扩张,包蕴部分类,极度和接口,综合应用他们可用来增派大家分析任何类,接口,方法,属性,方法和扩张。这一个oop扩张被称呼反射。

打字与印刷结果:

越来越多关于PHP相关内容感兴趣的读者可查阅本站专项论题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总计》、《PHP互联网编制程序工夫计算》、《PHP数组(Array)操作本事大全》、《php字符串(string)用法总括》、《php+mysql数据库操作入门教程》及《php常见数据库操作手艺汇总》

透过ReflectionClass,我们得以拿走Person类的以下消息:

---------------------params-----------------------
Method [ <internal:redis> public method bitpos ] {
}

可望本文所述对大家PHP程序设计有着扶助。

1)常量 Contants
2)属性 Property Names
3)方法 Method Names静态
4)属性 Static Properties
5)命名空间 Namespace
6)Person类是否为final恐怕abstract

并不曾看出供给参数,恐怕与该方式的有血有肉落实有关,具体原因只可以去看redis增加的代码完结,平常情状下应当是回来如下的格局,以mysqli的select_db方法为例:

你也许感兴趣的作品:

  • PHP面向对象程序设计等等与反射API详解
  • PHP反射使用实例和PHP反射API的中文表达
  • PHP
    反射机制实现动态代理的代码
  • 深入分析php中反射的运用
  • PHP反射机制用法实例
  • 在PHP中应用反射本领的架构插件使用表明
  • 详解php中反射的施用
  • PHP类的反光用法实例
  • php反射应用示范
  • PHP
    反射(Reflection)使用实例
  • php利用反射完毕插件机制的艺术
  • php反射类ReflectionClass用法剖析

例子

$ref = new ReflectionClass('mysqli');
echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL;
$reflectMethod = $ref->getMethod('select_db');  //传入方法名即可
echo $reflectMethod;  // 会调用$reflectMethod->__toString() 返回可打印的形式;



---------------------params-----------------------
Method [ <internal:mysqli> public method select_db ] {
 - Parameters [1] {
  Parameter #0 [ <required> $database ]
 }
}
class Person {
  /**
   * For the sake of demonstration, we"re setting this private
   */
  private $_allowDynamicAttributes = false;
  /** type=primary_autoincrement */
  protected $id = 0;
  /** type=varchar length=255 null */
  protected $name;
  /** type=text null */
  protected $biography;
    public function getId()
    {
      return $this->id;
    }
    public function setId($v)
    {
      $this->id = $v;
    }
    public function getName()
    {
      return $this->name;
    }
    public function setName($v)
    {
      $this->name = $v;
    }
    public function getBiography()
    {
      return $this->biography;
    }
    public function setBiography($v)
    {
      $this->biography = $v;
    }
}

那时就无法了
大家只可以靠对redis的明白以及参照相似方法来行使了,比方bitop

接下去反射它,只要把类名”Person”传递给ReflectionClass就足以了:

public function bitOp( $operation, $retKey, ...$keys) {}
$class = new ReflectionClass('Person');//建立 Person这个类的反射类
$instance = $class->newInstanceArgs($args);//相当于实例化Person 类

贴下最后的艺术调用

1)获取属性(Properties):

$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->setBit('bit', 15, 1);
echo 'bitpos: ' . $redis->bitpos('bit', 1) . PHP_EOL; //bitpos: 15
$redis->close();
$properties = $class->getProperties();
foreach($properties as $property) {
  echo $property->getName()."\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography

是否很风趣呢!

暗中认可情形下,ReflectionClass会获取到独具的属性,private 和
protected的也可以。若是只想取获得private属性,将在非凡传个参数:

更多关于PHP相关内容感兴趣的读者可查看本站专项论题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总括》、《PHP互连网编制程序技术总计》、《PHP数组(Array)操作技艺大全》、《php字符串(string)用法总括》、《php+mysql数据库操作入门教程》及《php常见数据库操作本领汇总》

$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

期待本文所述对我们PHP程序设计具备支持。

可用参数列表:

你大概感兴趣的稿子:

  • PHP使用反射机制落实查找类和办法的所在地点
  • PHP反射类ReflectionClass和ReflectionObject的采取办法
  • PHP面向对象程序设计等等与反射API详解
  • php反射类ReflectionClass用法深入分析
  • PHP通过反射动态加载第三方类和获得类源码的实例
  • PHP类的反光用法实例
  • PHP的反光类ReflectionClass、ReflectionMethod使用实例
  • 反射调用private方法实施(php、java)
  • php利用反射达成插件机制的诀窍
  • PHP
    反射机制达成动态代理的代码
  • 浅析php中反射的采取
  • PHP反射机制用法实例

ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE

假设要同临时候获得public 和private
属性,就疑似此写:ReflectionProperty::IS_PUBLIC |
ReflectionProperty::IS_PROTECTED。

通过$property->getName()能够获得属性名。

2)获取注释:

透过getDocComment可以收获写给property的笺注。

foreach($properties as $property) {
  if($property->isProtected()) {
    $docblock = $property->getDocComment();
    preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);
    echo $matches[1]."\n";
  }
}
// Output:
// primary_autoincrement
// varchar
// text

3)获取类的办法

获得方式(methods):通过getMethods() 来获取到类的有着methods。

4)试行类的艺术:

$instance->getBiography(); //执行Person 里的方法getBiography
//或者:
$ec=$class->getmethod('getName'); //获取Person 类中的getName方法
$ec->invoke($instance);    //执行getName 方法

愈来愈多关于PHP相关内容感兴趣的读者可查阅本站专项论题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法计算》、《PHP互连网编制程序技术总结》、《PHP数组(Array)操作本领大全》、《php字符串(string)用法计算》、《php+mysql数据库操作入门教程》及《php常见数据库操作技术汇总》

指望本文所述对我们PHP程序设计具有扶助。

您大概感兴趣的文章:

  • PHP管理正视(dependency)关系工具
    Composer的机关加载(autoload)
  • PHP
    反射机制完结动态代理的代码
  • PHP反射机制原理与用法详解
  • PHP反射机制用法实例
  • PHP中的reflection反射机制测量试验例子
  • PHP使用反射机制落到实处查找类和措施的所在地方
  • 实例介绍PHP的Reflection反射机制
  • PHP基于反射机制落到实处插件的可插拔设计详解
  • 浅谈PHP的反射机制
  • PHP的反射类ReflectionClass、ReflectionMethod使用实例
  • PHP基于反射机制达成全自动重视注入的秘籍详解

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website