批改状态:合格
老师批语:属性重载的意义 ,远没有方法重载的大, 在实际开发, 很多高级应用技术 ,都依赖方法重载 实现的
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();
}
}点击 "运行实例" 按钮查看在线实例
链式的数据库 查询 和 插入 功能运行结果:

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号