类成员“重载”

  • 属性重载

    属性重载实际上就是属性访问一个拦截器,用来过滤用户的请求
    重载属性简单实现一个访问限制
    1. class Demo
    2. {
    3. private $role='admin';
    4. private $username='admin';
    5. //属性重载
    6. public function __get($name)
    7. {
    8. if($this->role === 'admin'){
    9. return $this->username;
    10. }else{
    11. return '非法访问';
    12. }
    13. }
    14. }
    15. $obj=new Demo();
    16. echo $obj->username;
    • 获取器

      通常会自动创建一个获取器,动态的生成一个方法名称
      1. class Demo
      2. {
      3. protected $data=[
      4. 'name'=>'admin',
      5. ];
      6. public function __get($name){
      7. $method='get'.ucfirst($name);
      8. if(method_exists($this,$method))return $this->$method($name);
      9. }
      10. public function getName($name){
      11. if(!isset($this->data[$name])){
      12. $this->data[$name]=0;
      13. }else{
      14. return $this->data[$name];
      15. }
      16. }
      17. }
      18. $obj=new Demo();
      19. echo $obj->name;
    • 修改器

      __set当访问不存在无权限设置的属性时自动调用
      1. class Demo
      2. {
      3. protected $data=[
      4. 'name'=>'admin',
      5. ];
      6. public function __set($name,$value){
      7. $method='set'.ucfirst($name);
      8. if(method_exists($this,$method))return $this->$method($name,$value);
      9. }
      10. public function setEmail($name,$value){
      11. $this->data[$name]=$value;
      12. }
      13. }
      14. $obj=new Demo();
      15. $obj->email='admin@php.cn';
      16. var_dump($obj);
  • 方法重载

    • 普通方法重载 __call

      1. public function __call($name, $arguments)
      2. {
      3. return $name.'<br>'.implode(',',$arguments);
      4. }
      5. $obj=new Demo();
      6. var_dump($obj->hello(1,2,3));

    • 静态方法重载 __callstatic

      1. public static function __callStatic($name, $arguments)
      2. {
      3. return $name.'<br>'.implode(',',$arguments);
      4. }
      5. $obj=new Demo();
      6. var_dump(Demo::hello(1,2,3));

      全局成员 函数,常量,类

      不能重复定义

      命名空间

      主要就是为了解决全局成员的命名冲突

      1. namespace app1{
      2. class Model{
      3. }
      4. const PATH='app/';
      5. function get(){
      6. }
      7. echo Model::class,'<br>';
      8. echo PATH::class,'<br>';
      9. echo get::class,'<br>';
      10. }
      11. namespace app2{
      12. class Model{
      13. }
      14. const PATH='app/';
      15. function get(){
      16. }
      17. echo Model::class,'<br>';
      18. echo PATH::class,'<br>';
      19. echo get::class,'<br>';
      20. }


      全局命名空间

      1. namespace{
      2. class Model{
      3. }
      4. const PATH='app/';
      5. function get(){
      6. }
      7. echo Model::class,'<br>';
      8. echo PATH::class,'<br>';
      9. echo get::class,'<br>';
      10. }


      同名空间成员的组织方式
      防止一个命名空间的代码过多,可以将同一个命名空间的代码写到多个脚本中

      1. namespace app;
      2. require 'namespce1.php';
      3. require 'namespace2.php';
      4. echo Demo2::class,'<br>';
      5. echo Model::class,'<br>';


      子命名空间
      ```html
      namespace Ns1{
      class Demo{
      }
      echo Demo::class,’<br>‘;
      // namespace用在空间中,标识当前空间的引用,类似$this或self
      // echo namespace\Ns2\Demo::class;
      echo Ns2\Demo::class,’<br>‘;
      echo Ns2\Ns3\Demo::class,’<br>‘;
      echo ‘<hr>‘;
      }
      namespace Ns1\Ns2{
      class Demo{

      }

}
namespace Ns1\Ns2\Ns3{
class Demo{

  1. }

}

  1. ![](https://img.php.cn/upload/image/333/968/852/1616144775828115.png)
  2. 子命名空间访问上级
  3. ```html
  4. echo Demo::class,'<br>';
  5. //从子级访问上级
  6. echo \Ns1\Ns2\Demo::class,'<br>';
  7. echo \Ns1\Demo::class,'<br>';
  8. //访问全局
  9. echo \Demo::class,'<br>';

更多相关文章

  1. 重载get
  2. C++入门第一课(命名空间;输入输出;缺省参数;函数重载)
  3. php学习笔记(类的别名引入与命名冲突的解决方案),数据库常用操作命
  4. 第11章 0223-命名空间2与数据库基础1,学习心得、笔记(命名空间引
  5. 第10章 0222-重载,引用与命名空间,学心心得,笔记(属性、方法重载,命名
  6. PHP命名空间类三种引用|类导入命名冲突解决|自动加载类|mysql操
  7. php学习小结(类成员重载、全局成员、空间声明及成员访问)
  8. 命名空间与数据库基础
  9. PHP基础知识:命名空间的使用、自动加载器和数据库操作

随机推荐

  1. mysql数据库监控利器lepus天兔工具安装和
  2. Mysql主从复制读写分离
  3. MySQL查询返回用户的收件人列表
  4. linux系统下安装多个MySql数据库并做主从
  5. 在MySQL中盲目使用INSERT是否有缺点?
  6. 如何在列中搜索值,并在单个SQL查询中获取
  7. 最近用php写了一个从mysql数据库随机读取
  8. 创造一个多态关系与教义
  9. mysql中 character set 和collation关系
  10. Simple MySQL-C ORM - 简化C语言访问MySQ