zoukankan      html  css  js  c++  java
  • __set()与__get() 魔术方法

    在面向对象编程的过程中,对于类当中的各个成员变量,都有不同的访问属性,比如公有的(public)属性,在类内部和类外部都可直接调用;而私有的(private)和受保护的(protected),在类外不能直接赋值和使用,必须通过在类当中定义成员函数对该属性的成员变量进行操作,今天要提的__set()__get()魔术方法就是针对私有成员进行赋值获取值操作。

    具体的方法可以参考下面的示例代码:

    首先,不用魔术方法进行操作,直接定义函数:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    	</head>
    	<body>
    		<?php
    			class Person{
    				//下面是人的成员属性,都是封装的私有成员
    				private $name; //人的名子
    				private $sex; //人的性别
    				private $age; //人的年龄
    
    				//定义三个成员函数,分别用于对name,sex,age进行赋值。
    				public function setName($name){
    					$this->name=$name;
    				}
    				public function setSex($sex){
    					$this->sex=$sex;
    				}
    				public function setAge($age){
    					$this->age=$age;
    				}
    
    				//定义三个成员函数,分别用于获取name,sex,age的值。
    				public function getName(){
    					return $this->name;
    				}
    				public function getSex(){
    					return $this->sex;
    				}
    				public function getAge(){
    					return $this->age;
    				}
    			}
    
    			$p=new Person();
    
    			//通过成员函数,分别赋值
    			$p->setName("张三");
    			$p->setSex("男");
    			$p->setAge(20);
    
    			//通过成员函数,分别输出各值
    			echo "姓名:".$p->getName()."<br>";
    			echo "性别:".$p->getSex()."<br>";
    			echo "年龄:".$p->getAge()."<br>";
    		?>
    	</body>
    </html>
    

     然后下面一段代码是运用__set()、__get()方法实现相同的功能:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    	</head>
    	<body>
    		<?php
    			class Person{
    				//下面是人的成员属性,都是封装的私有成员
    				private $name; //人的名子
    				private $sex; //人的性别
    				private $age; //人的年龄
    
    				//__get()方法用来获取私有属性
    				private function __get($property_name){
    					echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>";
    					if(isset($this->$property_name)){
    						return($this->$property_name);
    					}
    					else{
    						return(NULL);
    					}
    				}
    
    				//__set()方法用来设置私有属性
    				private function __set($property_name, $value){
    					echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>";
    					$this->$property_name = $value;
    				}
    			}
    
    			$p1=newPerson();
    			//直接为私有属性赋值的操作,会自动调用__set()方法进行赋值
    			$p1->name="张三";
    			$p1->sex="男";
    			$p1->age=20;
    
    			//直接获取私有属性的值,会自动调用__get()方法,返回成员属性的值
    			echo "姓名:".$p1->name."<br>";
    			echo "性别:".$p1->sex."<br>";
    			echo "年龄:".$p1->age."<br>";
    		?> 
    	</body>
    </html>
    

     通过对比两个代码可以发现,用了魔术方法后,在类外可以直接对私有成员进行赋值或者取值。

  • 相关阅读:
    C陷阱与缺陷学习笔记
    C陷阱与缺陷学习笔记
    Linux Socket编程(不限Linux)
    Linux Socket编程(不限Linux)
    Windows API 教程(九) 网络编程
    Windows API 教程(九) 网络编程
    sockaddr与sockaddr_in的关系
    winsocket入门学习
    09-C语言数组
    08-C语言循环
  • 原文地址:https://www.cnblogs.com/-beyond/p/5720846.html
Copyright © 2011-2022 走看看