不应该通过类实例访问静态成员 解决方法_今天说一说php中的类与对象

本文探讨了PHP中的面向对象特性,尤其是类与对象之间的关系及静态成员的访问。通过示例区分了静态成员的类内访问(self关键字)和类外访问,以及普通成员的访问方式。同时讲解了静态成员属性和方法、普通成员属性和方法、类常量的访问规则,并探讨了类和对象的内存关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9a7d439e7a876974f6b59527c69b98e4.png

网上的文章博客这种东西已经写烂了。

我只是写写自己理解....

首先都知道php的面向对象,什么封装,集成,多态,灵活,简单,代码简洁,重用行强,利于维护,什么什么三个方向:灵活性,重用行,扩展性。


(网是一大波文章的文字大体一致,粘贴复制的货,练标点符号都一样....介绍的好像邻居java的面向对象就不行似的)--就是吐槽一下粘贴复制的人。。

还好今天不讲面向对象。。我就是谢谢面向对象中的 类与对象的关系还有访问(详细)

首先先说一下访问:(分两类)

访问又分为静态成员的访问和普通成员访问

1:静态成员

  • 类内访问

self::$静态属性名 / self::$静态方法名 / 类常量名 (其实类内页可以使用类外访问的类名的访问方式,不过考虑到了后期类名的更改,self就很方便的解决了这个问题)

  • 类外访问

类名::$静态属性名 / 类名::$静态方法名 / 类常量名

2:普通成员

  • 类内访问

$this->属性名 / $this->方法名

  • 类外访问

$对象名->属性名 / $对象名-> 方法名 ($对象名 指的是实例化后的对象)

别觉得乱,我单个演示

演示区:

一:静态成员属性的访问二

1: 静态外部访问

5f0fdd4965660d1163604cd5bc619fc3.png

2:静态内部访问 (要知道,在类内部访问类成员必须定义一个方法来访问)

087dfe7bad8230dad7fcfa181fd8c3d2.png

40945e3d9c8c0369341a8f2bb35a79d9.png

1:类内访问类内成员首先要定义一个方法在方法内访问;

2:最开始介绍到:类内其实可以使用2图中类名的访问方式,考虑到项目后期可能会有类名更改问题,类内最好使用self来代替

(不过也正好证明了在类内访问其实就是使用进行指定类内的成员,讲这个是因为不同于普通成员中的类内访问方式--$this)

二:静态成员方法的访问

1:在类外访问

89ba26c2916bbdd2ce76f7fc1f96ed35.png

在类外使用 类名::类中的方法名。 (__METHOD__指的是当前方法的方法名

1:在类内访问

7b77304a1381a0e55d54574d48f5f9f1.png

类内访问静态方法,同样需要在方法内访问,定义的方法可以使用普通方法进行访问,也可以定义一个同样是静态方法的方法来访问其他静态方法。。(可能这句话有些绕,直接分析框中的代码就行)

三:普通成员的属性访问

1:在类外访问

c983a5372cded998b0a07961f38cd6f2.png

(其中有个需要注意的地方一会儿后面总结,记得看)

2:在类内访问

bcab0b17fa181f1b2de20e78596ff79f.png

你可能已经发现了,为什么在最开始静态访问演示的时候,红框内的变量名都由$符号,而这里却没有。

要知道这里面php里面有个可变属性和可变方法。下面来演示一下。

9a903cc59c1dd604c1321ebd3e35f7cc.png

在外面如果不带$,就是代表着取obj这个对象中进行访问查找 为此名字的成员。

一旦加上$,因为在类外部,就会被当做变量来找,所以就会报错。当然可以这样写 ⬇

a5ed53d2c4cb2a6cecf613c71d8b3832.png

(其中一个值当作另一个的名)当obj进行指向访问的时候 $member就会被解析为 member

四:普通成员的方法访问

1:类外访问

5505bea200e253835b1b18e85baa83b0.png

2:类内访问

1e49da6b1fb97898f4d29f3eb3f26841.png

在次直接写了 可变的 形式,方法同样适用,思考(这样的好处可以咋以后比如前台页面的访问可以都给定 一个页面,页面中定义好类,类中定义好各个对象,通过页面点击传递要制定的对象名也就是方法名,然后使用可变的形式,来随时替换到变量,而调用只需要调用一次 $obj->变量名)

五:类常量的访问

首先:类常量就是const定义的常量。

要记住:类常量只能用const来定义

1:类外访问

cdee8b10ea5d6fecce29dd41b0597970.png

1:类内访问

1bdcd818a75c9d7a47c5d33209752b33.png

跟静态方式其实一样,但唯一的差别就是就是最前面第一张图中的 注释,变量名在类内声明的时候没有 $。

注意:(至于可变的形式,在常量中类内或者类外访问都不可以)不过在调用方法的时候可以使用可变的形式,毕竟跟常量也没太大关系。

最后来说一下 类于对象的内存关系吧:

我们上面都知道,静态访问和类常量都是使用 类名来访问,而其他都是通过实例化的对象来访问。

其实:

在类内部,是分空间的,静态成员一般保存在类空间里,而像其他的 普通属性都是保存在对象的空间里(这里的对象指的是实例化的对象)

而唯一特殊的就是 成员方法,它按我们的访问方式是通过 对象来访问的,但是它并不存储在对象的空间里,相反存储在了 类的空间里。

我们来使用前面的代码 证明一下:

一:

6890f31b0644633477260e5df96c8cbd.png

可以看出 新声明的obj1 明显没有被前面的 obj 改变的成员5 而改变!

就算是这个特殊的成员方法虽然存在了类空间里,但是仍不会被改变。

这样的原因就是因为存储在了 实例化的对象的空间里,一个实例化中的改变不会英雄其他实例化对象的改变

二:

c20c411cc94e0efff3d87de3166f7157.png

而在类空间中除了不能改变的常量外的静态成员只要被改变,其他的实例化对象同样就会被调用。如上图显示。

这是差不多的理解还有解释,以后继续补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值