Correction status:qualified
Teacher's comments:属性重载的意义 ,远没有方法重载的大, 在实际开发, 很多高级应用技术 ,都依赖方法重载 实现的
1、// 类成员的访问控制
// 1. public: 默认的, 任何地方可以访问, 类内, 类外, 子类中
// 3. protected: 受保护的, 对外是封闭的不可访问, 但是类的内部和子类可以访问
// 3. private: 私有的, ***于本类中的访问
<?php namespace _0801test; // 类成员的访问控制 // 1. public: 默认的, 任何地方可以访问, 类内, 类外, 子类中 // 3. protected: 受保护的, 对外是封闭的不可访问, 但是类的内部和子类可以访问 // 3. private: 私有的, ***于本类中的访问 class Demo { public $name; protected $position; private $salary; protected $department; public function __construct($name,$position,$salary,$department) { $this->name=$name; $this->position=$position; $this->salary=$salary; $this->department=$department; } // 职位获取器方法 public function getPosition() { return $this->department==='人事部'? $this->position:'无权查看'; } // 工资获取器方法 public function getSalary() { return $this->salary; } // 工资设置器方法 public function setSalary($value) { $this->salary=$value; } } // 客户端 //$obj=new Demo('admin','php程序员','6000','开发部'); $obj=new Demo('jack','HR','5000','人事部'); echo $obj->name."<br>"; //echo $obj->position;//报错,受保护的, 对外是封闭的不可访问, 但是类的内部和子类可以访问 echo $obj->getPosition().'<br>'; //echo $obj->salary;//报错,私有的, ***于本类中的访问,外部和子类不能访问 echo $obj->getSalary().'<br>'; $obj->setSalary(6666); echo $obj->getSalary().'<br>'; echo '<hr>'; class Sub extends Demo { public function salary(){ echo '工资:'; // return $this->salary; ///报错,私有的, ***于本类中的访问,外部和子类不能访问 } public function position() { return $this->position; } } $sub=new Sub('tom','java工程师',8888,'开发部'); echo $sub->salary().'<br>'; echo '<hr>'; echo $sub->getSalary().'<br>'; echo $sub->position().'<br>'; echo $sub->getPosition();
点击 "运行实例" 按钮查看在线实例
2、// 静态属性和静态方法 又叫 类属性和类方法。 普通的属性和方法 又叫 实例属性和实例方法
<?php namespace _0801test; // 静态属性和静态方法 又叫 类属性和类方法。 普通的属性和方法 又叫 实例属性和实例方法 class Demo1 { public $name; //静态属性;static public static $age; public function __construct($name,$age) { $this->name=$name; // 在类中访问静态的成员 self::$age=$age; } // 实例方法 public function getInfo1() { return $this->name.' 年龄是: '.self::$age; } // 静态方法 public static function getInfo2() { echo 'aa'.'<br>'; // return $this->name.' 年龄是: '.self::$age;//报错,静态方法里面不能访问$this,即不能有实例 } // 静态方法1 public static function getInfo3($name){ return $name.' 年龄(静态getInfo3)是:'.self::$age; } } $obj=new Demo1('admin',22); // 实例属性 echo $obj->name.'<br>'; // 静态属性, 类的外部直接用类名访问, 双冒号: 范围解析符 echo Demo1::$age.'<br>';// 静态属性1 echo $obj::$age.'<br>';// 静态属性2 echo '<hr>'; // 实例方法 echo $obj->getInfo1().'<br>'; //静态方法 echo $obj->getInfo2(); $name=$obj->name; echo $obj->getInfo3($name).'<br>'; ////静态方法1 echo Demo1::getInfo3($name); ////静态方法2 echo '<hr>'; echo '<hr>'; $obj1=new Demo1('admin1',11); echo Demo1::$age.'<br>';// 静态属性1 echo $obj1::$age.'<br>';// 静态属性2 $name=$obj1->name; echo $obj1->getInfo3($name).'<br>'; ////静态方法1 echo Demo1::getInfo3($name); ////静态方法2
点击 "运行实例" 按钮查看在线实例
3、// 类常量 只能用const定义,不能用define
<?php namespace _0801test; class Demo2 { // 类常量 只能用const定义,不能用define const NATION='中国'; // 类量与类属性不一样,类属性就是静态属性 public static $sex='男'; private $name; public function __construct($name) { $this->name=$name; } // 实例方法 public function getInfo() { return $this->name.'的性别是:'.self::$sex.', 国籍是:'.self::NATION; } } $obj=new Demo2('admin'); // 访问类属性: 静态属性 echo Demo2::$sex.'<br>'; // 访问类常量,与访问静态属性一致 echo Demo2::NATION.'<br>'; Demo2::$sex='女'; //静态属性值可以修改 echo Demo2::$sex.'<br>'; //Demo2::NATION='China'; //报错,类常量不能修改 echo Demo2::NATION.'<br>'; echo $obj->getInfo();
点击 "运行实例" 按钮查看在线实例
4、// 属性重载 当访问一个不存在的或者私有属性(权限不够)或方法的时候,能够触发的一些列的魔术方法
// __get($name), __set($name, $value), __isset($name), __unset($name)
<?php namespace _0801test; // 属性重载 当访问一个不存在的或者私有属性(权限不够)或方法的时候,能够触发的一些列的魔术方法 // __get($name), __set($name, $value), __isset($name), __unset($name) class Demo3 { private $name; private $salary; protected $age; protected $position='人事主管'; public function __construct($name,$salary,$age) { $this->name=$name; $this->salary=$salary; $this->age=$age; } // 属性重载方法: __get() 获取属性值 public function __get($name) { if ($name==='age'){ return ($this->name==='admin')?'无权查看':$this->$name; } return $this->$name; } // 属性重载方法: __set() 设置属性值 public function __set($name, $value) { if($name==='position'){ ($this->name==='admin')?'无权修改':$this->$name=$value; }else{ $this->$name=$value; } } // public function test() // { // // get_class_vars(): 返回类中属性组成的数组 放类的外部只能访问public属性,放类的内部就能访问private 和 protected // $properties=get_class_vars(self::class); // echo '<pre>'.print_r($properties,true); // } // // 属性重载方法: __isset() 判断属性是否定义 public function __isset($name) { // if ($this->$name==true){ // echo $this->$name.'<br>'; // }else{ // echo '没有该属性<br>'; // } if(isset($this->$name)){ echo '存在该属性<br>'; } else { echo '没有这个属性<br>'; } } // 属性重载方法: __unset()销毁属性 public function __unset($name) { if($this->name==='admin'){ unset($this->$name); }else{ echo '无权删除<br>'; } } } $obj=new Demo3('admin',8888,28); $obj1=new Demo3('admin111',6666,23); echo $obj->name.'<br>'; echo $obj->salary.'<br>'; echo $obj->age.'<br>'; echo $obj->position.'<br>'; //echo $obj->abc.'<br>';//报错,没有该属性 echo '<hr>'; echo $obj1->name.'<br>'; echo $obj1->salary.'<br>'; echo $obj1->age.'<br>'; echo $obj1->position.'<br>'; echo '<hr>'; $obj->salary=9999; echo $obj->salary.'<br>'; $obj->position='总经理'; echo $obj->position.'<br>'; $obj1->salary=7777; echo $obj1->salary.'<br>'; $obj1->position='开发工程师'; echo $obj1->position.'<br>'; echo '<hr>'; echo '通过__set()和__get()新增属性和获取属性值<br>'; $obj->abc='abc'; echo $obj->abc.'<br>'; echo '<hr>'; //$obj->test(); // 检测某一个属性是否存在 isset($obj->name); //isset($obj->salary); //isset($obj->age); //isset($obj->position); isset($obj->abc); isset($obj->abc1); echo '<hr>'; unset($obj->age); isset($obj->age); unset($obj1->age); isset($obj1->age); echo '<hr>'; //unset($obj->abc); //echo $obj->abc; //unset($obj->abc1); //echo $obj->abc1;
点击 "运行实例" 按钮查看在线实例
5、// 方法重载: __call(), __callStatic()
<?php namespace _0801test; // 方法重载: __call(), __callStatic() function sum($a,$b) { return $a+$b.'<br>'; } echo __NAMESPACE__.'<br>'; echo call_user_func_array(__NAMESPACE__.'\sum',[10,20]); echo '<hr>'; class Test1 { public function sum1($a,$b) { return $a+$b.'<br>'; } } $test1=new Test1(); echo call_user_func_array([$test1,'sum1'],[1,2]); echo call_user_func_array([new Test1(),'sum1'],[2,3]); echo '<hr>'; class Test2 { public static function sum2($a,$b) { return $a+$b.'<br>'; } } //将对象/类中的方法以回调的方式来执行 echo Test2::sum2(7,8); echo call_user_func_array([__NAMESPACE__.'\Test2','sum2'],[8,8]); echo call_user_func_array(__NAMESPACE__.'\Test2::sum2',[8,9]); // 完整的类名 = 命名空间 + 类名, 类名::class echo Test2::class.'<br>'; echo call_user_func_array([Test2::class,'sum2'],[9,9]); echo '<hr>'; echo '<h3>方法重载 </h3>'; class Demo4 { // 重载普通方法 // $name: 要重载的方法名称, $arguments: 传给当前方法的参数组成的数组 public function __call($name, $arguments) { return '实例方法:'.$name.'<br>参数列表:'.'<pre>'.print_r($arguments,true); } public static function __callStatic($name, $arguments) { return '静态方法:'.$name.'<br>参数列表:'.'<pre>'.print_r($arguments,true); } } $obj=new Demo4(); // 访问一个不存在的方法 echo $obj->getInfo1(1,'hh',6,[11,22]); // 访问一个不存在 的静态方法 echo Demo4::getInfo2('aaa','bbb');
点击 "运行实例" 按钮查看在线实例
6、链式的数据库
<?php namespace _0801test; require 'Query.php'; use _0801test\Query; class Db { // 数据库的连接对象 protected static $pdo=null; // 连接方法 public static function connection() { self::$pdo=new \PDO('mysql:host=localhost;dbname=listen0724','root','root'); } public static function __callStatic($name, $arguments) { // 连接数据库 self::connection(); // 实例 化一个查询类Query.php, table(), filed(), select()这些链式方法的提供者 $query=new Query(self::$pdo); // 执行查询类中的方法 return call_user_func_array([$query,$name],$arguments); } } //查询所有数据 $db1=Db::table('nav')->select(); foreach ($db1 as $db){ print_r($db); echo '<br>'; } echo '<hr>'; //查询指定数据 $db2=Db::table('nav') ->field('nav_id,alias') ->where('nav_id>1') ->limit('0,2') ->select(); foreach ($db2 as $db){ print_r($db); echo '<br>'; } echo '<hr>'; //插入数据 //$db3=Db::table('nav') // ->data("`name`='download',`alias`='下载中心',`image`='nav.jpg'") // ->add(); // //echo $db3; echo '<hr>'; //修改数据 //$db4=Db::table('nav') // ->data("`image`='image1.jpg'") // ->where('nav_id=10') // ->update(); //echo $db4; //echo '<hr>'; //删除数据 //$db5=Db::table('nav') // ->where('nav_id=10') // ->delete(); //echo $db5;
点击 "运行实例" 按钮查看在线实例
Query.php代码:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2019/8/2 * Time: 19:29 */ namespace _0801test; class Query { public $pdo=null; public $table; public $field='*'; public $where; public $limit; public $data=''; public function __construct($pdo) { $this->pdo=$pdo; } // 设置表名 public function table($tableName) { $this->table=$tableName; // 关键步骤: 返回一个当前类的实例 return $this; } // 设置数据 public function data($data='') { $this->data=empty($data)?'':$data; return $this; } // 设置字段 public function field($fields='*') { $this->field=empty($fields)?'*':$fields; return $this; } // 设置查询条件 public function where($where='') { $this->where=empty($where)?$where:' where '.$where; return $this; } // 设置数量 public function limit($limit) { $this->limit=empty($limit)?$limit:' limit '.$limit; return $this; } // 查询语句 public function select() { // 拼装SQL语句 $sql='select ' .$this->field .' from ' .$this->table .$this->where .$this->limit; // 预处理查询 $stmt=$this->pdo->prepare($sql); $stmt->execute(); // die($stmt->debugDumpParams()); //数据库调试语言 return $stmt->fetchAll(\PDO::FETCH_ASSOC); } //插入语句 public function add() { $sql='insert into ' .$this->table .' set ' .$this->data; $stmt = $this->pdo->prepare($sql); $stmt->execute(); return $this->pdo->lastInsertId(); } //修改语句 public function update() { if($this->where==''){ return 0; } $sql='update ' .$this->table .' set ' .$this->data .$this->where; $stmt = $this->pdo->prepare($sql); $stmt->execute(); return $stmt->rowCount(); } //删除语句 public function delete() { if($this->where==''){ return 0; } $sql='delete from ' .$this->table .$this->where; $stmt = $this->pdo->prepare($sql); $stmt->execute(); return $stmt->rowCount(); } }
点击 "运行实例" 按钮查看在线实例
链式的数据库 查询 和 插入 功能运行结果: