问答文章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

我来回答

5个回答

懂视网 时间: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

<?php
//代码可以直接放到编辑器中测试
//php不是纯面向对象的语言,错误提示的意思是 在调用未定义的say函数时,发生致命错误!!
//首先你的问题在于,你没有把对象中的方法,放到类中
//正确的写法是
class person{
var $name;//定义类中的name属性
var $sex;//定义类中的sex属性
function say(){//定义say()函数
echo "this is ".$this->name." saying";//通过$this->$name来调用类中的属性
}
function run(){
echo "look at that ".$this->sex.' '.$this->name." is running!!";
}
}
//以上代码是定义类的部分,下面实例化出对象,并运行类中的方法
$person2=new person();
$person2->name="李五";//以为李四用的太多了 呵呵
$person2->sex="boy";
$person2->say();echo "<br/>";
$person2->run();
//希望对你有用 代码可以直接复制到编辑器中测试
?>

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

你定义的对象$person2是对person类的实例化,而$person2->say();是调用person类的成员方法。很明显你的person里并没有say()这个方法。所以应该把你定义的2个函数放在类里面。你看给你的错误提示:意思就是你调用了一个没有定义的方法person::say()。所以就应该明白错误在哪了。

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

函数 say 和 run 都应该放在类 person 的定义体内
比如这样:

<?php // Class Person
class person
{
var $name;
var $sex;
function say()
{
echo "this is a person say" . "<br>";
}
function run()
{
echo "this is a person <br>";
}
}
$person1 = new person(); //定义一个新的person值
$person2 = new person(); //定义一个新的person值

$person2->name = "green"; //给新定义的person值中传入内容
$person2->sex = "boy";

echo "this is person2:" . $person2->name . "<br>";
echo "this is person2 sex:" . $person2->sex . "<br>";
$person2->say(); //访问已经定义的对象中的方法
?>

热心网友 时间:2022-04-06 21:04

$person2->say();//
你的类里面哪里有say这个方法啊???
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
便携式发电机十大名牌 冬天夜跑同时锻炼身体和意志的句子锦集 冬天的时候跑步可以达到46~60分钟 可是夏天了跑步25分钟左右就已经感觉... 孩子病毒性感冒咳嗽厉害怎么办 严重的病毒性感冒几天能好 宝宝六个月因为病毒性感冒而咳嗽有痰可每次咳嗽出来的痰他吐不出来怎 ... ios购买的app怎么退款 求助!书法高手!用什么书法来“魏亮”这二字最漂亮? 万事胜意,喜乐长安繁体 什么叫喜乐长安 篮球技巧———怎样抓球 X线CT区别 CT和X光一样么(非专业人士勿扰) 手抓篮球球转技巧 请问CT和X光片一样吗?如果不一样,那他们的区别在哪里? 篮球如何抓球!技巧或窍门! 【解签】第四百七十九悟真常尊者 田间溪畔现影身,山野荒丘自耕耘; 胸存韬略谁知晓,不争权利不争名。 云 唐杜牧 尽日看云首不回,无心都大似无才。 可怜光彩一片玉,万里晴天何处来? 翻译一下 如何单手抓球 怎么抓篮球 伏兽是什么意思 一个手怎么抓住篮球啊 有什么技巧?? 匍门是什么意思 X光 和CT光有什么不一样? 作为一个山野老农,他就这样来实现自己的价值。他已经将自己的生命转化为另一种东西。这句话的意思是? 用手抓篮球的技巧 易经中园林之财是什么? 单手抓球技巧 算命先生说夺妻之财是什么意思? 拌木耳洋葱的做法大全 手机怎么投屏不了到电视 法语的动词不定式 淘宝客推广账户总览里浏览量是3是什么意思 法语问题:不定式用法 请问法语动词不定式有什么意义? 怎么查看淘宝客的等级比如K1K2K3K4K5K6,是淘宝客的等级哈. ...appSecret、pid分别都是什么意思?如题 谢谢了 淘宝客真的可以赚钱吗? 详细&#xFFFD;0&#xFFFD;3 法语 动词不定式 过去时怎么用啊?她和复合过去时的用法有什么区别 多谢! 淘宝客提问 法语问题:faire+动词不定式 淘宝 我昨天就成交2双为什么淘宝客收取了我3双的推广费用?或者是它收取的是当天确认收货的费用 法语中不定式可以做状语吗?我记得是不行的啊,那这句话里不定式是什么成分呢 Apres avoir 如果做兼职,以下几种选哪个 1.做威客2.淘宝客3.微商 法语中的à和pour都可以接动词不定式? 关于法语de的用法 法语se的用法 法语动词做句子主语 关于法语se的问题。。 法语faire faire的用法~~请教问题