现在的位置: 首页 > 综合 > 正文

PHP 之 面向对象小例

2013年02月04日 ⁄ 综合 ⁄ 共 1435字 ⁄ 字号 评论关闭
<?php
class Person {
	private $name;
	private $sex;
	private $age;
	
	function __construct($name = "", $sex = "男", $age = 22) {
		$this->name = $name;
		$this->sex = $sex;
		$this->age = $age;
	}
	
	// 直接为私有属性赋值时自动调用,可以屏蔽一些非法赋值
	// 之前有版本可以设置方法为private function __set()
	// The magic method __set() must have public visibility
	// 因为5.35对魔术方法限制的严格了
	public function __set($propertyName, $propertyValue) {
		if ($propertyName == "sex") {
			if (! ($propertyValue == "男" || $propertyValue == "女")) {
				return;
			}
			
			if ($propertyValue > 150 || $propertyValue < 0) {
				return;
			}
		}
		
		// 根据传入的成员属性名,赋上相应的值
		$this->$propertyName = $propertyValue;
	}
	// 用来获取私有属性
	public function __get($propertyName) {
		if (isset ( $this->$propertyName )) {
			return ($this->$propertyName);
		} else {
			return (NULL);
		}
	}
	
	public function __isset($propertyName) {
		if ($propertyName == "name") {
			return false; // 返回假,不允许在对象外部测定这个属性
		}
		
		return isset ( $this->$propertyName );
	}
	
	public function __unset($propertyName) {
		if($propertyName=="name") {
			return; //不允许删除name属性
		}
		
		unset($this->$propertyName);
	}
	function say() {
		echo $this->name . "在说话<br/>";
	}
	
	function run() {
		echo "在走路·<br/>";
	}
	
	function __destruct() {
		echo "goodbye" . $this->name . "<br/>";
	}
}

$person1 = new Person ();
$person2 = new Person ( "2" );
$person3 = new Person ( "3" );

// 自动调用了__set()
$person1->name = "张三";

echo $person1->name;

echo "<br/>";

echo $person1->say ();

// 自动调用了__get()
echo $person1->age;
echo "<br/>";


var_dump ( isset ( $person1->name ) );
echo "<br/>";

unset($person1->name);

echo "unset------------>".$person1->name;//name 没有被unset()
echo "<br/>";
$person2 = null;
?>

结果:

张三
张三在说话
22
bool(false) 
unset------------>张三
goodbye2
goodbye3
goodbye张三

抱歉!评论已关闭.