• 欢迎加入MineBBS QQ讨论群:点击查看所有的官方讨论群
  • 我们将于近期对服务器进行迁移,服务可能中断至多2日。请各位安排好自己的访问计划,造成不便敬请谅解!
  • MineBBS入站考试已经上线!想要成为【正式会员】解锁更多功能吗?快来参与吧!【点我去看】

已解决 新手关于实例化的一些问题

新生

【Lv:2】

注册
2021/09/05
消息
43
金粒
5,133.09金粒
//第一种情况 class Test { public $a; public function Run($run) { $this->a = $run; echo $this->a; } } $h = new Test; $h->Run(114514); //第二种情况 class Test { public $a public function Run($run) { $this->$a = $run; echo $a; } } $h = new Test; $h->Run(114514);

问题:这两种情况都能跑,而且运行的结果是一样的。
但是第一种情况是$this->a(不需要public $a;也能跑),第二种是$this->$a;
这看起来很混乱,而且我很难搞懂他们有什么区别,用起来还没有什么区别
但是如果应用于实际开发,他们两种可能会有一种出现问题,到时候的损失会是不可估量的。

但是我在学习的时候发现实例是这样写的

<?php

class Test {
public $a;

public function Run() {
echo $this->a;
}
}

$h = new Test;

$h->a = 10;

$h->Run();

//输出了10


我更加混淆了

望大佬解答!
 
解决方案
偶然路过(
先说第二种情况 很明显这是一个错误的写法 如下图2 光标抹黑的部分被认为是一个变量 这行之前并没有声明变量a 变爆炸了(
1638101233548.png
假设在前面给这个变量a赋值一个a 分别输出变量a和全员属性a 便成功了

1638101523053.png

再说一三种,public 变量名 代表声明一个类的全局属性 如果不声明就类似于private 只能再类的内部获取到 例如下图
1638101679444.png

第三种 则是由于 全局属性 $a 是public的 你便可以在外部实例化之后去给它赋值


2021年居然有想要学习pm插件的新人 1638101986571.jpeg 感人肺腑
偶然路过(
先说第二种情况 很明显这是一个错误的写法 如下图2 光标抹黑的部分被认为是一个变量 这行之前并没有声明变量a 变爆炸了(
1638101233548.png
假设在前面给这个变量a赋值一个a 分别输出变量a和全员属性a 便成功了

1638101523053.png

再说一三种,public 变量名 代表声明一个类的全局属性 如果不声明就类似于private 只能再类的内部获取到 例如下图
1638101679444.png

第三种 则是由于 全局属性 $a 是public的 你便可以在外部实例化之后去给它赋值


2021年居然有想要学习pm插件的新人 1638101986571.jpeg 感人肺腑
 
最后编辑:
解决方案
偶然路过(
先说第二种情况 很明显这是一个错误的写法 如下图2 光标抹黑的部分被认为是一个变量 这行之前并没有声明变量a 变爆炸了(
浏览附件21120
假设在前面给这个变量a赋值一个a 分别输出变量a和全员属性a 便成功了

浏览附件21121

再说一三种,public 变量名 代表声明一个类的全局属性 如果不声明就类似于private 只能再类的内部获取到 例如下图
浏览附件21122

第三种 则是由于 全局属性 $a 是public的 你便可以在外部实例化之后去给它赋值


2021年居然有想要学习pm插件的新人 浏览附件21123 感人肺腑
感谢大佬的解答,我有一些想法了,我不确定我理解的对不对
所以就是说如果我不声明变量$a然后写$this->a是不行的,因为$this->a相当于一个private的变量?
但是我声明变量了$a在写$this->$a的话就行,而且$a相当于public?
如果我上面的猜测不对,那么是不是因为$this->a和$a根本就是两种变量???
另外如果我在函数的外面声明了$a的话函数内部无法使用这个变量???
感谢您能思考我的问题,如果我的问题是因为学习进度不足的话,我会继续学习。如果我的问题是大家共性的问题,我将十分乐意参与讨论并分享意见,共同学习!
 
感谢大佬的解答,我有一些想法了,我不确定我理解的对不对
所以就是说如果我不声明变量$a然后写$this->a是不行的,因为$this->a相当于一个private的变量?
但是我声明变量了$a在写$this->$a的话就行,而且$a相当于public?
如果我上面的猜测不对,那么是不是因为$this->a和$a根本就是两种变量???
另外如果我在函数的外面声明了$a的话函数内部无法使用这个变量???
感谢您能思考我的问题,如果我的问题是因为学习进度不足的话,我会继续学习。如果我的问题是大家共性的问题,我将十分乐意参与讨论并分享意见,共同学习!
1. 不声明 public $a; 只 $this->a 相当于一个类属性的动态声明 当你调用这个时候 php就会给$this下创建一个属性供你后续使用 (虽然之前说类型是private 其实不严谨,但是可以勉强去这样理解) 而从外部因为无法找到有一个public类型的属性$a 变无法调用 (实际开发中 应该避免直接动态声明 少数情况下某些魔术方法可能会因此爆炸)
2. 感觉可能误解我的意思了( $this->$a 这里$a的是一个只在你写的Run方法内有效的一个变量 不声明$a 直接调用必然会报错
3. 更具体来说 $this->a 相当于调用 这个类里的全局属性“a” , $this->$a 相当来说 调用这个类里全局中叫“变量$a值” 的属性
4. 类里面每个方法中的变量都是只在这个方法里存在 如果要多个方法公用就要存放在全局属性里(也可以说叫成员 例如声明的public $a)如果需要外部变量传入 请给所调用函数加参数或者加到构造函数里 并再实例化类时传入

文档永远是最方便快捷的参考资料
 
谢谢了,我会继续加油的
1. 不声明 public $a; 只 $this->a 相当于一个类属性的动态声明 当你调用这个时候 php就会给$this下创建一个属性供你后续使用 (虽然之前说类型是private 其实不严谨,但是可以勉强去这样理解) 而从外部因为无法找到有一个public类型的属性$a 变无法调用 (实际开发中 应该避免直接动态声明 少数情况下某些魔术方法可能会因此爆炸)
2. 感觉可能误解我的意思了( $this->$a 这里$a的是一个只在你写的Run方法内有效的一个变量 不声明$a 直接调用必然会报错
3. 更具体来说 $this->a 相当于调用 这个类里的全局属性“a” , $this->$a 相当来说 调用这个类里全局中叫“变量$a值” 的属性
4. 类里面每个方法中的变量都是只在这个方法里存在 如果要多个方法公用就要存放在全局属性里(也可以说叫成员 例如声明的public $a)如果需要外部变量传入 请给所调用函数加参数或者加到构造函数里 并再实例化类时传入

文档永远是最方便快捷的参考资料
 

在线会员

  • HQI8
  • imxx
  • shenbi_micro
  • hanyee
  • XiXia
  • XC_shoot
  • QY_
  • wd1223
  • Kongba1d
  • 奇妙之旅
  • TX112233
  • 炎之火风
  • nightlicapoo
  • 天通苑达人
  • WangYiXiao
  • xyurenTuT
  • ChararahC
  • HYTV_Lemon
  • 是沫穆诶
  • ganxiaozhe
...和 22 更多。
后退
顶部 底部