Correction status:qualified
Teacher's comments:
编程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);
点击 "运行实例" 按钮查看在线实例