parent,::,$this,self的分别

PHP对象关键字详解
本文详细解释了PHP中parent, ClassName, $this, self等关键字的区别与用法,并对比了PHP4与PHP5的不同之处。
对JAVA对象比较了解的人一般应能区分楼主说的几类名称的区别,PHP的对象概念在某些方面与JAVA极为相似,只是写法略有差别。下面我大致说一下楼主提到的几个概念:parent, ClassName, $this, self在PHP4与PHP5中的区别。

parent:: - 名称空间,指父类空间,引用父类的静态或动态方法。在PHP4中只能引用父类的方法,而在PHP5中还可以引用父类的成员变量。如果parent:: 引用的是静态方法,则与一般的ClassName:: 引用一样。如果parent:: 引用的是动态方法,则该方法中的$this并非指代父类实例化对象,而是指代子类的实例化对象,对这点尤其要注意,不要弄错了。

ClassName:: - 名称空间,指某个类,在PHP4中只能引用该类的静态方法(虽然实际上可以引用动态方法,但往往不能得到期望的结果,因为此方法中的$this为NULL,是没有意义的),在PHP5中只能引用该类的静态方法或成员变量。

$this->;  - 对象,只能用于类动态方法内部,不能用于静态方法,指代当前类的实例对象,如果用ClassName::method()这种方式调用动态方法method,则方法method中的$this不被实例化,这时$this为NULL或是为unset。$this可以引用本类中任何方法或成员变量。

self:: 名称空间,指代本类,但不指代本类的实例化对象。只在PHP5中有效。只能引用本类的静态方法或静态成员变量——虽然也可以引用动态方法,但没有意义。

如果有人不懂何谓静态或动态,则详情请看JAVA的静态方法或静态成员的概念。如果有人不懂何谓实例化,解决方法同上。如果有人不知何谓对象,则请查阅JAVA或是PHP的手册。如果还不会,则请关闭浏览器,去玩游戏好了。
 
以下是一个 `TreeNode` 类的实现,包含 `add_children`、`remove`、`move`、`find`、`get_siblings`、`get_descendants` 和 `get_tier` 方法: ```python class TreeNode: def __init__(self, value, left=None, right=None): self.value = value self.left = left self.right = right self.parent = None if left: left.parent = self if right: right.parent = self def add_children(self, *children): for child in children: if not self.left: self.left = child child.parent = self elif not self.right: self.right = child child.parent = self else: raise ValueError("This node already has two children.") def remove(self): if self.parent: if self.parent.left == self: self.parent.left = None elif self.parent.right == self: self.parent.right = None self.parent = None def move(self, new_parent): self.remove() new_parent.add_children(self) def find(self, value): if self.value == value: return self if self.left: result = self.left.find(value) if result: return result if self.right: return self.right.find(value) return None def get_siblings(self): if self.parent: if self.parent.left == self: return self.parent.right elif self.parent.right == self: return self.parent.left return None def get_descendants(self): descendants = [] if self.left: descendants.append(self.left) descendants.extend(self.left.get_descendants()) if self.right: descendants.append(self.right) descendants.extend(self.right.get_descendants()) return descendants def get_tier(self): tier = 0 current = self while current.parent: tier += 1 current = current.parent return tier ``` ### 代码解释: - **`add_children`**:该方法用于向节点添加子节点。如果左子节点为空,则将子节点添加到左子节点;如果左子节点不为空但右子节点为空,则将子节点添加到右子节点;如果左右子节点都不为空,则抛出异常。 - **`remove`**:该方法用于移除当前节点。它会将当前节点从其父节点中移除,并将其父节点引用置为 `None`。 - **`move`**:该方法用于将当前节点移动到新的父节点下。它先调用 `remove` 方法将当前节点从原父节点中移除,然后调用新父节点的 `add_children` 方法将当前节点添加到新父节点下。 - **`find`**:该方法用于在树中查找具有指定值的节点。它会递归地在左子树和右子树中查找,如果找到则返回该节点,否则返回 `None`。 - **`get_siblings`**:该方法用于获取当前节点的兄弟节点。如果当前节点有父节点,则返回其父节点的另一个子节点;否则返回 `None`。 - **`get_descendants`**:该方法用于获取当前节点的所有后代节点。它会递归地获取左子树和右子树的所有后代节点,并将它们添加到一个列表中返回。 - **`get_tier`**:该方法用于获取当前节点在树中的层级。它通过不断向上遍历父节点,直到根节点,并记录遍历的次数,即为节点的层级。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值