面向对象之链式操作

链式操作的格式是:$obj->(方法或属性)->(方法或属性)->(方法或属性)...方法或属性一般都是类中定义的函数。下面是一个事例:

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<?php
			class Student{
				private $name;
				private $age;
				public function setName($name){
					$this->name=$name;
					return $this;	//重中之重,一定要返回$this
				}
				public function setAge($age){
					$this->age=$age;
					return $this;
				}
				public function getName(){
					return $this->name;
				}
				public function getAge(){
					return $this->age;
				}
			}
			$stu=new Student();
		 	echo $stu->setName("Jane")->setAge(20)->getAge();
		 	//输出的时候只能输出一个值

			class Person{
				public $stu;
				public function setStu(){
					$this->stu=new Student();
					return $this;
				}
				public function getStu(){
					return $this->stu;
				}
			}
			$per=new Person();
			echo $per->setStu()->getStu()->setName("Jenny")->setAge(18)->getAge();
			//必须先setStu(),然后必须要getStu()后才能后续的函数
		?>
	</body>
</html>

我觉得链式操作的主要重点在于 ‘return $this;'明确$this代表的是什么,答案是:返回当前类的对象。

开始比较困惑的是上面在进行链式操作输出的时候,为什么不能同时输出getName()和getAge().一旦写在一起,就会提示"Fatal error: Call to a member function getAge() on a non-object",非得分开写才行。

后来想通了,链式操作其实就是在上一步完成的前提下,对于上一步返回的值或者类进行操作。比如上面的echo $stu->setName("Jane")->setAge(20)->getAge();首先是调用$stu类当中的setName()进行赋值,现在假设赋值成功后,不返回$this,那么下一步调用setAge()就会出错,Fatal error: Call to a member function setAge() on a non-object in...,原因是setAge()没有操作对象,所以setName()必须有return $this,而且setAge()也必须有return $this,否则后面的函数将因为没有操作对象而出错。

原文地址:https://www.cnblogs.com/-beyond/p/5694720.html