批改状态:合格
老师批语:
编程1: 类声明与类的实例化

<?php
//类的声明与实例化
//类声明用class;类的实例化用new;类的对象成员访问符用->
//声明类
class Demo1
{
}
//类的实例化
$demo1 = new Demo1();
//给当前对象添加属性
$demo1->name = '王先生';
$demo1->sex = '男';
//给当前对象添加方法
$demo1->hello = function()
{
return '我是一个自定义的类方法';
};
//使用对象访问符访问对象中的成员(属性和方法)
//访问属性
echo $demo1->name,'<br>','性别:',$demo1->sex,'<br>';
//访问方法
//echo $demo1->hello();错误的调用方式,因为当前对象方法不是一个普通函数,而是一个对象方法
echo call_user_func($demo1->hello);//call_user_func();把第一个参数作为回调函数调用点击 "运行实例" 按钮查看在线实例
编程2: 类常量与类属性的重载

<?php
//类常量与类属性的重载
//1.类常量可以用来创建对象之间的共享数据
//2.对象初始化:用构造方法实现。创建对象之前会自动调用,完成对象的一些初始化工作。
// 例如:对象属性初始化,创建对象时自动调用的方法等,方法名称固定为:__construct()
//3.属性重载:在类的外部访问不存在或者无权限访问属性时,会自动触发此类方法
// 属性重载涉及四个方法:__get();__set();__isset();__unset();
class Demo2
{
//类常量:所以对象共享,用类名+范围解析符::访问,且默认为公共属性public
const SITE_NAME = 'PHP中文网';
//声明私有属性
private $name;
private $course;
private $grade;
//构造方法
public function __construct($name,$course,$grade)
{
$this->name = $name;
$this->course = $course;
$this->grade = $grade;
//构造方法不仅可以初始化对象属性,还可以调用方法。
echo $this->show();
}
//输出属性内容
public function show()
{
return $this->name.'的《'.$this->course.'》课程成绩是:'.$this->grade.'分';
}
//获取属性重载__get
public function __get($name)
{
if ($name == 'grade')
{
return $name.'不允许查看';
}return $this->$name;
}
//更新属性重载__set
public function __set($name,$value)
{
if ($name == 'grade')
{
echo $name.'不允许修改';
}
$this->$name = $value;
}
//属性检测的重载__isset
public function __isset($name)
{
if ($name == 'grade')
{
return false;
}return isset($this->$name);
}
//销毁属性重载
public function __unset($name)
{
if ($name == 'grade' || $name == 'name')
{
return false;
}unset($this->$name);
}
}
//访问类常量:类常量可以被该类的所有对象所共享,所以不属于任何一个对象,应该使用类来访问
echo '站点名称:',Demo2::SITE_NAME,'<br> ';
//实例化Demo2创建对象
$demo2 = new Demo2('王先生','PHP',88);
echo '<br>';
var_dump($demo2);
echo '<br>';
//访问属性,因为属性全部被封装,所以必须通过一个统一的外部接口访问
echo $demo2->show();
echo '<hr>';
//如果想简化以上操作,可以在实例化之前,在构造方法中调用属性访问接口方法
new Demo2('王先生','PHP',88);
echo '<hr>';
//属性操作: 获取,设置,检测,销毁
//获取
echo '姓名:',$demo2->name,'<br>';//访问私有属性,如类中无__get()会出错,如有自动触发
echo '姓名:',$demo2->grade,'<br>';//可以在__get()进行属性访问的权限控制
//设置
$demo2->course = 'Python';
echo '课程:',$demo2->course,'<br>';
$demo2->grade = 65;
echo '<hr>';
//检测.因为grade是私有属性,所以外部检测不到,类中用_isset()方法就可以检测到
echo isset($demo2->name) ? '存在<br>':'<span style="color:red">不存在</span><br>';
echo isset($demo2->grade) ? '存在<br>':'<span style="color:red">不存在</span><br>';
//销毁
echo $demo2->course,'<br>';//销毁前展示
unset($demo2->course);//销毁
echo $demo2->course,'<br>';//销毁后检测
unset($demo2->name); // 重载方法中__unset()设置了不允许销毁grade和name属性
unset($demo2->grade);// 重载方法中__unset()设置了不允许销毁grade和name属性
echo $demo2->name,'<br>';// 所以这里仍可以访问到name属性
echo $demo2->grade,'<br>';// 所以这里仍可以访问到grade属性点击 "运行实例" 按钮查看在线实例
编程3: 类的继承与方法重写

<?php
//类的继承与方法重写
//
//1.类之间的继承,是代码复用的重要手段,之前我们是通过“函数”实现代码复用
//2.继承使用的关键字是:extends
//3.引用父类成员:parent::
//4.子类可以将父类中的公共public和受保护protected成员全部继承
class Demo3
{
//父类属性
public $name;
protected $age;
private $salary;
const APP_NAME = '学生管理系统';
//父类构造器
public function __construct($name,$age)
{
$this->name = $name;
$this->age = $age;
}
/*//属性访问重载,哪个类工作,属性重载就卸载哪个类里。new的哪个类,就是在哪个类工作。
public function __get($name)
{
if(isset($this->$name))
{
return $this->$name;
}return '非法属性';
}*/
}
class Demo3_1 extends Demo3
{
//子类自有属性
private $sex;
const APP_NAME = '教师管理系统';//类常量可以在子类中重写
//子类将父类同名方法进行重写(必须对父类的属性重新声明),根据传入参数不同,实现不同的功能,这就是多态性
public function __construct($name,$age,$sex='male')
{
/*//属性声明:方法1
$this->name = $name;
$this->age = $age;
$this->sex = $sex;*/
//属性声明:方法2:引用父类的构造方法来简化代码
parent::__construct($name,$age);
$this->sex = $sex;
}
//将父类属性重载方法重写后,顺利读取子类属性
//所以属性重载方法__get()应该设置在最终工作类中(例如:本类Demo3_1),而不是父类Demo3中
//此时,将父类Demo3中的__get()删除,代码执行仍然正确
public function __get($name)
{
if(isset($this->$name))
{
return $this->$name;
}return '非法属性';
}
}
//当前类Demo3_1中即使没有任何成员,一样可以访问父类成员
$Demo3_1 = new Demo3_1('wang',80);
//访问父类中的属性
echo $Demo3_1->name,'<br>';
echo $Demo3_1->age,'<br>';
echo $Demo3_1->salary,'<br>';//父类私有属性子类不可见,访问不到。
echo Demo3::APP_NAME,'<br>';
echo Demo3_1::APP_NAME,'<br>';//访问类常量
//echo Demo3_1->sex;//取不到值,因为父类__get()不能识别子类属性点击 "运行实例" 按钮查看在线实例
编程4: 类中静态成员的声明与访问

<?php
//类中静态成员的声明与访问
//
//1.类中静态成员使用关键字:static 定义。
//2.静态成员包括:静态属性和静态方法。
//3.静态成员是属于类的,我们应该使用类来访问
//4.静态属性必须使用类来访问,而静态方法即可以使用类,也可以用对象访问
//5.静态成员是可以有访问限制的:public,protected,private
//6.静态成员与对象无关,所以内部不允许使用伪变量:$this
//7.访问时,类名后必须使用:范围解析符:双冒号::
//8.在类中引用自身使用关键字: self::
//
//范围解析符的作用
//1.访问静态成员
//2.访问类常量
//3.继承上文中引用被覆盖成员
class Demo4
{
public static $pdo = null;
protected static $db =
[
'type' => 'mysql',
'host' => 'localhost',
'dbname' => 'edu',
'user' => 'root',
'pass' => 'root',
];
public static function connect()
{
//等价于mysql:host=localhost;dbname=edu
$dsn = self::$db['type'].':host='.self::$db['host'].';dbname='.self::$db['dbname'];
//等价于$pdo = new PDO('mysql:host=127.0.0.1;dbname=edu,'root','root');
self::$pdo = new PDO($dsn,self::$db['user'],self::$db['pass']);
}
public static function select($table,$fields='*',$num=5)
{
$stmt = self::$pdo->prepare("SELECT {$fields} FROM {$table} LIMIT {$num}");
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
//连接数据库
Demo4::connect();
//查询数据表
$result = Demo4::select('user','name,email',6);
//显示结果
echo '<pre>',var_export($result);点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号