Note:类(Class)

本文详细解释了PHP中静态成员和方法的概念,包括如何在类的继承结构中使用self::和parent::作用域限定符来访问基类和父类中的静态成员。同时介绍了静态方法与非静态方法的区别及使用原则,以及一些类辅助函数如class_exists(), get_class(), instanceof等的使用方法。


    静态成员,可以看作是属于整个类而不是类的某个实例,只保留一个变量值,而这个变量值对所有实例都有效,也就是说,所有实例共享这个变量


    $this只表示当前实例,self::表示类本身,在类之外的代码中不能使用self::,且self::不能标识自己在继承树层次结构中的位置。也就是说,在扩展类中使用self::作用域时,self::可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。与$this不同的是,在使用静态变量时,必须在作用域限定符后面加上$符号。


    在扩展类中,在基类方法被重写的情况下,使用parent作用域调用定义在基类中的方法。静态成员可以只属于父类。如果在子类和父类中同事声明了某个成员,可以使用parent:;在子类中访问父类中的变量。在某些情况下,父类的静态成员和子类的静态成员保存不同的值。
可以在::操作符左边写上类的名称来静态的访问某个成员,这样避免创建类的实例。不仅省略实例化类的代码,而且还会更搞笑,因为类的每个实例都会调用一小部分的系统资源。


    在使用::操作符访问成员变量的时候,需要注意对$符号的使用。因为PHP当前不支持动态的静态变量使用,也就是说不支持可变的静态变量。在使用$this->$var时,被访问的成员是包含在$var中的变量的值,而不用$符号访问某个变量实际上查找类的某个常量,而常量是不能通过$this来访问的。
PHP6提出的static::作用域使我们不再需要使用self::和parent::。当希望指向最终的实现功能的类时,可以使用static::,这个限定符会在代码执行之前计算出继承层次结构上最后那个类的成员,这一过程被称为延迟绑定,它使我们可以在子类中重写某个静态变量,并且也可以从某个在父类中声明的函数中范文这个最终还曾元。

    静态方法与非静态方法间的一个重要区别:在调用静态方法时,不再需要拥有类的实例。


    静态方法与非静态方法的使用原则:如果某个方法中不包含$this变量,就应该使用静态方法;如果不需要类的实例,可能还应该使用静态类来避免去实例化类的工作,静态方法中不能使用$this变量,因为静态方法不属于某个特定的实例。

   instanceof可以确定一个对象时类的实例、类的子类、还是实现了某个接口,并进行相应的操作

类辅助函数

boolean class_exists(string class_name)
string get_class(object object)                                 //确定对象的上下文
array get_class_methods(mixed class_name)
array get_class_vars(string class_name)                         //定义的字段
array get_declared_classes(void)                              //当前执行脚本中定义的所有类名
array get_object_vars(object object)
string get_parent_class(mixed object)
boolean interface_exists(string interface_name[, boolean autoload])
boolean is_subclass_of(object object, string class_name)
boolean method_exists(object object, string method_name)



__autoload函数,当引用未在脚本中定义的类时会自动调用个函数

newObject = clone oldObject;
__clone()方法用来调整对象的克隆行为,在代码克隆操作期间执行。

不支持方法重载、操作符重载、多重继承

在C++或Java等面向对象语言中,错误信息 **"note: declared private here"** 通常出现在你尝试访问一个的私有(private)成员变量或成员函数时。编译器会提示该成员是在某处被声明为 `private` 的,因此无法从的外部直接访问。 --- ## 示例说明(C++) ### 示例代码: ```cpp #include <iostream> using namespace std; class MyClass { private: int secretValue; // 私有成员变量 public: MyClass(int val) : secretValue(val) {} }; int main() { MyClass obj(42); cout << obj.secretValue; // 错误:试图访问私有成员 return 0; } ``` ### 编译器报错: ``` error: ‘int MyClass::secretValue’ is private within this context cout << obj.secretValue; ^~ note: declared private here int secretValue; ^~~~~~~~~~~ ``` --- ## 解决方案: ### ✅ 方法一:提供公有访问方法(getter) ```cpp class MyClass { private: int secretValue; public: MyClass(int val) : secretValue(val) {} // 提供 getter 函数 int getSecretValue() const { return secretValue; } }; int main() { MyClass obj(42); cout << obj.getSecretValue(); // 正确访问 return 0; } ``` --- ### ✅ 方法二:使用友元函数(friend function) 如果你希望某个非成员函数能访问私有成员: ```cpp #include <iostream> using namespace std; class MyClass { private: int secretValue; public: MyClass(int val) : secretValue(val) {} friend void printValue(const MyClass& obj); // 声明友元函数 }; // 友元函数定义 void printValue(const MyClass& obj) { cout << obj.secretValue; // 合法,因为是友元 } int main() { MyClass obj(42); printValue(obj); // 输出 42 return 0; } ``` --- ### ✅ 方法三:将另一个设为友元 ```cpp class MyClass { private: int secretValue; public: MyClass(int val) : secretValue(val) {} friend class ValuePrinter; // 允许 ValuePrinter 访问私有成员 }; class ValuePrinter { public: void print(const MyClass& obj) { cout << obj.secretValue; // 合法 } }; ``` --- ## 小结: | 问题 | 原因 | 解决办法 | |------|------|----------| | `note: declared private here` | 访问了的私有成员 | 使用 getter、友元函数或友元 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值