问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于php面向对象的问题,求对框架原理了解的大神。

发布网友 发布时间:2022-04-06 14:51

我来回答

4个回答

懂视网 时间:2022-04-06 19:12

本文目标

掌握PHP中数据访问的3种方式的定义和作用

1、public

2、protected

3、private

(一)、数据访问的3种方式

1、Public:公有的类成员

可以在任何地方访问,具体可以被哪些访问了:

● 定义该类的类(自身)

● 该类的子类

● 其他类

2、Protected:受保护的类成员

● 定义该类的类(自身)

● 该类的子类

3、Private:私有的类成员

● 只有自身才可以访问

总结:从上到下约束能力是越来越强的

单纯从以上的文字描述,我们理解起来还是有点费力的,那么还是按照理论+实践的方式来进行理解,那么接下来我们就通过具体的代码来理解这3种数据访问的方式在PHP中到底是如何实现的,到底它们各自的特点是什么,最后来体会一下它们的约束能力到底又是怎样。

(二)具体代码

说明:为了让大家能更好的理解面向对象,所以写文章的时候,我也是尽量遵循一定的规则,由浅到深,由易到难,所以我写的每篇文章都是和上篇文章有一定的关联,比如以下的代码案例,我又是在上篇文章的代码上进行的拓展和延伸。

案例一:知道public的定义,然后证明它可以在3个地方都可以访问(1.在自己定义的类中,2.在子类中 3.在外部)

<?php

//定义 “人” 类
class Human{
 public $name = "";//姓名 
 public $height = "";//身高
 public $weight = "";//体重

 public function eat($food){
 echo $this->name."在吃".$food."<br/>";
 }
}
//女主播
class Anchors extends Human{
 public $name = "";
 public $stageName = "";
 public function __construct( $name,$stageName ){
 $this->name = $name;
 $this->stageName = $stageName;
 }
 public function singing(){
 echo "我是女主播,我会唱歌<br/>";
 }
 
}
// Nba球员类
 class NbaPlayer extends Human{
 //因为父类已经有了,所以就不需要再写了,通过extends来实现
 // public $name = "";//姓名
 // public $height = "";//身高
 // public $weight = "";//体重

 public $team = "";//团队
 public $playerName = "";//球员号码

 public function __construct( $name,$height,$weight,$team,$playerName ){
 $this->name = $name;
 $this->height=$height;
 $this->weight = $weight;
 $this->team = $team;
 $this->playName = $playerName;
 echo "构造函数执行了,当前对象是{$this->name}<br/>";
 }
 
 
 //跑步
 public function run(){
 echo "跑步中<br/>";
 }
 //跳跃
 public function jump(){
 echo "跳跃<br/>";
 }
 //运球
 public function dribble(){
 echo "运球<br/>";
 } 
 //传球
 public function pass(){
 echo "传球<br/>";
 }
 //投篮
 public function shoot(){
 echo "投篮<br/>";
 }
 //扣篮
 public function dunk(){
 echo "扣篮<br/>";
 }
 }

 //数据访问测试
//public 测试
//1、测试在类的外部可以访问
 //创建乔丹对象
 $jordon = new NbaPlayer("乔丹","1.98米","98公斤","公牛","23");
 //输出乔丹对象
 echo "名称= ".$jordon->name."<br/>";//结果能够输出来,说明在外部是可以访问Public类成员的

//2、测试在类的自身里面可以访问
//例子:比如构造函数里,我们可以直接通过$this->team

//3、测试是否可以子类中可以访问
//例子:比如父类中定义的name 一样可以在子类(NbaPlayer)的构造函数中直接访问

?>

运行效果如下:

3.png

案例二:知道protected的定义,然后证明它可以在2个地方都可以访问(1.在自己定义的类中,2.在子类中 )

<?php
//定义“人”类
class Human{
 public $name = "";//姓名
 public $height = "";//身高
 public $weight = "";//体重

 protected $addr = "长沙";//受保护的类
 
 public function eat($food){
 echo $this->name."在吃".$food."<br/>";
 }
 //测试protected类成员是否可以在自身类中可以访问
 public function getAddrInHuman(){
 echo "Human 自身类中的add=".$this->addr."<br/>";
 }
}
//女主播
class Anchors extends Human{
 public $name = "";
 public $stageName = "";
 public function __construct( $name,$stageName ){
 $this->name = $name;
 $this->stageName = $stageName;
 }
 public function singing(){
 echo "我是女主播,我会唱歌<br/>";
 }
 //重写方法eat
 public function eat($food){
 echo "我是女主播,我是边唱歌边吃{$food}<br/>";
 }
}
 class NbaPlayer extends Human{
 //因为父类已经有了,所以就不需要再写了,通过extends来实现
 // public $name = "";//姓名
 // public $height = "";//身高
 // public $weight = "";//体重

 public $team = "";//团队
 public $playerName = "";//球员号码

 public function __construct( $name,$height,$weight,$team,$playerName ){
 $this->name = $name;
 $this->height=$height;
 $this->weight = $weight;
 $this->team = $team;
 $this->playName = $playerName;
 echo "构造函数执行了,当前对象是{$this->name}<br/>";
 }
 
 //测试protected类成员是否可以在子类中可以访问
 public function getAddrInNbaPlayer(){
 echo "在NbaPlayer子类中addr=".$this->addr."<br/>";
 }
 }

 //创建乔丹对象
 $jordon = new NbaPlayer("乔丹","1.98米","98公斤","公牛","23");

 //数据访问测试
 //protected测试
 //1、测试是否可以在自身类中可以访问
 $jordon->getAddrInHuman();//结果OK,确实是可以访问
 //2.测试是否可以在子类中访问
 $jordon->getAddrInNbaPlayer();//结果OK,确实也是可以访问
 //3.测试是否可以被外部访问
 echo "在类外部访问addr=".$jordon->addr."<br/>";//结果报错,说明不行

?>

运行效果如下:

2.png


案例三:知道private的定义,然后证明它只能在1个地方可以访问(1.在自己定义的类中)

<?php
//定义“人”类
class Human{
 public $name = "";//姓名
 public $height = "";//身高
 public $weight = "";//体重

 private $isHungry = true;//测试私有变量是否可以在子类中访问
 
 //为了让外部可以访问private类成员
 public function getPrivateInfo(){
 return "private 变量 isHungry=".$this->isHungry."<br/>";
 }
}
//女主播
class Anchors extends Human{
 public $name = "";
 public $stageName = "";
 public function __construct( $name,$stageName ){
 $this->name = $name;
 $this->stageName = $stageName;
 }
 public function singing(){
 echo "我是女主播,我会唱歌<br/>";
 }
 //重写方法eat
 public function eat($food){
 echo "我是女主播,我是边唱歌边吃{$food}<br/>";
 }
}
 class NbaPlayer extends Human{
 //因为父类已经有了,所以就不需要再写了,通过extends来实现
 // public $name = "";//姓名
 // public $height = "";//身高
 // public $weight = "";//体重

 public $team = "";//团队
 public $playerName = "";//球员号码

 public function __construct( $name,$height,$weight,$team,$playerName ){
 $this->name = $name;
 $this->height=$height;
 $this->weight = $weight;
 $this->team = $team;
 $this->playName = $playerName;
 // echo "构造函数执行了,当前对象是{$this->name}<br/>";
 }
 //测试private类成员是否可以在子类中访问
 public function getIsHungryInNbaPlayer(){
 echo "在NbaPlayer子类中isHungry=".$this->isHungry."<br/>";
 }
 }
 
 //创建乔丹对象
 $jordon = new NbaPlayer("乔丹","1.98米","98公斤","公牛","23");

 //数据访问测试
 //private测试
 //1.测试私有变量能否被外部访问
 echo "私有变量isHungry =".$jordon->isHungry ."<br/>";//结果不能访问,说明private变量不能被子类访问
 //测试私有变量能否在定义的类的内部访问
 echo $jordon->getPrivateInfo();//结果Ok,说明可以 
//测试私有变量是否可以在子类中访问
$jordon->getIsHungryInNbaPlayer();//结果报错,说明也不能在子类中访问

?>

运行效果如下:

5.png

总结:

1、Public:公有的类成员

可以在任何地方访问,具体可以被哪些访问了:

● 定义该类的类(自身)

● 该类的子类

● 其他类

2、Protected:受保护的类成员

● 可以被其自身及其子类访问

3、Private:私有的类成员

● 只有自身才可以访问

4.为了让外部可以访问private类成员,我们可以通过在类中定义一个public方法,然后在public方法中返回private类成员

好,到了这里,想必大家对数据访问应该有了一个比较清晰的认识,那我们现在来学以致用,用我们学到的这个知识来解决以下的问题,先自己思考一下怎么做,然后再看答案

问题:NBA球员一般都不想让其他人知道自己的真实姓名,比如说我明明是40岁,但是我就想让别人以为是38岁

思考中.......................

答案揭晓:

代码如下:

<?php

class Human{
 public $name = "";//姓名
 public $height = "";//身高
 public $weight = "";//体重

}
//女主播
class Anchors extends Human{
 public $name = "";
 public $stageName = "";
 public function __construct( $name,$stageName ){
 $this->name = $name;
 $this->stageName = $stageName;
 }
 public function singing(){
 echo "我是女主播,我会唱歌<br/>";
 }
 //重写方法eat
 public function eat($food){
 echo "我是女主播,我是边唱歌边吃{$food}<br/>";
 }
}
 class NbaPlayer extends Human{
 //因为父类已经有了,所以就不需要再写了,通过extends来实现
 // public $name = "";//姓名
 // public $height = "";//身高
 // public $weight = "";//体重

 public $team = "";//团队
 public $playerName = "";//球员号码

 //数据访问
 private $age = "40";
 //end

 public function __construct( $name,$height,$weight,$team,$playerName ){
 $this->name = $name;
 $this->height=$height;
 $this->weight = $weight;
 $this->team = $team;
 $this->playName = $playerName;
 echo "构造函数执行了,当前对象是{$this->name}<br/>";
 }
 
 
 //跑步
 public function run(){
 echo "跑步中<br/>";
 }
 //跳跃
 public function jump(){
 echo "跳跃<br/>";
 }
 //运球
 public function dribble(){
 echo "运球<br/>";
 } 
 //传球
 public function pass(){
 echo "传球<br/>";
 }
 //投篮
 public function shoot(){
 echo "投篮<br/>";
 }
 //扣篮
 public function dunk(){
 echo "扣篮<br/>";
 }
 
 //数据访问 
 public function getAge(){
 // echo $this->name."的age=".$this->age."<br/>";
 //既然能够在自身类中获取到年龄,那么为了解决NBA球员不想让别人知道自己真实年龄的问题
  //我们就可以对年龄进行操作-造假 让年龄更小
 $age = $this->age-2;
 echo $this->name."的age=".$age."<br/>";
 }
 }
 
 //创建乔丹对象
 $jordon = new NbaPlayer("乔丹","1.98米","98公斤","公牛","23");
 $jordon->getAge();//结果Ok 说明年龄是可以获取到的,既然可以获取到age我们在函数内部作假,来达到一个谎报年龄的目的
?>

运行效果如下:

4.png

总结:

1.知道了在PHP中数据访问有三种形式,public,protected,private

2.知道了3种数据访问方式各自的特点

热心网友 时间:2022-04-06 16:20

自己设计框架学习意义远大于实用意义,设计的过程中可能会浪费你不少时间,而且你可能以后永远不会(99%)用到自己设计的框架,但是对你深入了解PHP还是很有帮助的。

(我自己也有在设计一个框架,如有兴趣,可以发给你一起研究)


大部分PHP MVC框架中心思想都是一样的:

首先要单文件入口(index.php),就是所有的访问都通过一个文件来控制,这样就能控制流程了。要实现这个功能就需要apache或者nginx的设置来配合了。以apache为例,最经典的.htacess:

<IfMole mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=$1 [QSA,L]
</IfMole>

此文件的作用就是如果如果访问的文件或者文件夹存在的话就直接调用文件(用来处理访问/public/css, /public/js之类的请求),不然的话就将请求转发给index.php。此时index.php可以调用$_GET['_url'] 来获得请求。


#一般框架遵循的规则是:[地址]/[控制器名字]/[方法名字]/[参数/参数]
#请求: localhost/test/helloworld/china/shanghai
#在index.php里就可以访问$_GET['_url']来获得字符串:/test/helloworld/china/shanghai

然后将字符串explode()成array,根据默认规则获得以下信息(如果愿意可以自己写一个路由而不用默认方法解析路径)

控制器:test

方法:helloworld

参数:china, shanghai


先在test.php中:

class test
{
    public function helloworld($country, $city)
    {
        echo 'Hello, I am from', $country, $city;
    }
}


然后在index.php中:

#这里可以自己定义一个__autoload方法来让PHP自行require_once() class文件,就不用自己一个一个include()了。

#初始化一个控制器实例:
$test = new test();

#调用控制器中的方法,并递交参数
#请查阅PHP函数call_user_func_array()的使用方法
call_user_func_array( array($test, 'helloworld'),  array('china','shanghai') );

这样就完成了一个简单的MVC框架,剩下的就是继续完善他,你可能需要学习以下知识:

PHP __autoload()的设计和命名空间(namespace)的设计

各种软件设计模式:singleton, dependency injection, lazy loading

OOP(面向对象编程)PHP类的继承模式(extends class), PHP接口(implements interface)

PHP数据库操作类: mysqli类, pdo类

HTTP请求,header中的各种参数设置

Web Programming的安全事项, 如xss防护

《代码简洁之道》,《PHP Zend Coding Style》


希望能帮助到你!

追问一个地方不太清楚,new test(),这个得自己写吗?如果我想new 其他的对象呢?我想让不清楚类控制器的名字,只知道类控制器的位置和类名(get知道类名),去创建控制器类对象。

追答//当然可以, $controller是控制器的名字
$instance = new $controller();

热心网友 时间:2022-04-06 17:38

这个不难,但在这里一两句还真说不清楚!
但关键上, “简单点说,就是根据你get来的参数去包含文件就好了,我就自己做的"
这个朋友回答的还真没错!
不是人家没看清楚你的问题, 而是你没理解到而已!

热心网友 时间:2022-04-06 19:13

简单点说,就是根据你get来的参数去包含文件就好了,我就自己做的追问大哥,看清楚我的问题。

追答好吧,我吃多了。
看不懂当我没说好了。。。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
狐外婆是什么意思? ...都流,有几年了,吃香蕉水果时也流,到底什么原因啊,维生素c也补了也没... 我的牙龈经常出血,刷牙出得最凶,有时候吃香蕉都会出血,请问是什么原 ... 如何通过社交软件添加好友? 过年送礼送购物卡合适吗? 林上的UV能量测试仪的自动和手动模式有什么区别啊?什么情况下用的... 什么是建设银行金卡 建行信用金卡有什么好处 紫外测试仪UV能量计常见问题解答 020028什么卡 儿童版十万个为什么答案及解释在线阅读 十万个为什么少儿版 十万个为什么和百科全书有什么不同? 《十万个为什么儿童版》pdf下载在线阅读全文,求百度网盘云资源 《少儿版十万个为什么》全446集mp3 十万个为什么儿童版 duhougan 十万个为什么儿童版故事绘画语音版 十万个为什么(儿童版) 可以治疗黑眼圈吗? 儿童版十万个为什么 最近睡眠不好,黑眼圈很重,兰川世家可以去黑眼圈吗? 幼儿版十万个为什么的内容简介 枸杞和红枣泡水喝能祛黑眼圈吗? 十万个为什么儿童版的内容简介 《十万个为什么》哪一个版本好? 十万个为什么儿童版 长期服用黑枸杞可以改变肌肤吗? 《儿童版十万个为什么》故事书讲的是什么? 雷锋的故事这本小学版这本书一共多少字 好书推荐雷锋的故事 老照片的故事的作文怎么写 老照片的故事(作文)怎么写 《老照片的故事》这篇作文怎么写 以《老照片的故事》作文250字 以老照片的故事为题的作文 老照片的故事作文怎么写 老照片的故事 600字作文 如何评价2016年电影《飞鹰艾迪》 《飞鹰艾迪》激发了你的飞翔梦吗? 《飞鹰艾迪》怎么样 美国电影《飞鹰艾迪》是讲什么的? 这七部电影让你惊喜了吗? 飞鹰艾迪 怎么开始不重要 重要的怎么结束 《飞鹰艾迪》原型生平是怎么样的? 《飞鹰艾迪》原型是什么? 《飞鹰艾迪》真实人物是什么? 飞鹰艾迪为什么纪念安加得 保罗 《飞鹰艾迪》真实人物是谁? 飞鹰艾迪的幕后制作 飞鹰艾迪的制作发行