• 周年纪念勋章活动已圆满结束,如有已购买但仍未申请的用户,可以通过对应勋章的下载链接申请~

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

新生

【Lv:2】

注册
2021/09/05
消息
44
金粒
5,133金粒
//第一种情况 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)如果需要外部变量传入 请给所调用函数加参数或者加到构造函数里 并再实例化类时传入

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

在线会员

  • 落雨前夕
  • B1ack
  • bluezjx
  • hhgihhg
  • aisibi
  • 2409460473
  • 648645654465456
  • 古怪ilil
  • sssjiu
  • TheMagic_Star
  • zw35426
  • Oreocookies_
  • anbandun
  • 墨绒
  • xianyu637
  • littleduan
  • 离川
  • LiZi35
  • xinghe0635
  • Edithfus
  • PuddingKC
...和 77 更多。
后退
顶部 底部