`

面向对象设计 1 —— PHP5面向对象基础(基础部分)

    博客分类:
  • PHP
阅读更多
<?
//面向对象基础,定义一个类使用一个对象
//定义一个类 这里class Class 是没有区别的
Class Person{
	
	//定义属性  
	//Public(公开): 可以自由的在类的内部外部读取、修改。
	//Private(私有): 只能在这个当前类的内部读取、修改。
	//Protected(受保护):能够在这个类和类的子类中读取和修改。
	public $name = "noName";
	public $age = 20;
	public function __toString() {
		//$this 指当前对象。
		//在方法内部通过 $this-> 符号调用同一对象的属性。
        return "我的名称:".$this->name."&nbsp;&nbsp;&nbsp;我的年龄:".$this->age;
	}
}

$p = new Person();
var_dump($p);
echo "<br>";
print_r($p);
echo "<br>";
echo  $p;//会自动调用类中的__toString()方法,所以如果这样做就必须在类中声明一个__toString()
echo "<br>";
echo "我的名字是:".$p->name; 
echo "<br>";
echo "我的年龄是:".$p->age;

//这里我们改变对象的属性,由于属性是public所以允许改变
$p->name = "Tom";
$p->age = 25;
echo "<br>";
echo "我的名字是:".$p->name; 
echo "<br>";
echo "我的年龄是:".$p->age;
?>


<?
//关于对象中的私有方法
class Person{
	private $name = "noName";
}
$p = new Person();

echo $p->name;//由于是私有属性所以不能在外部直接访问。Fatal error: Cannot access private property Person::$name in 

?>


<?
/**
	属性赋值
	PHP5中,在属性定义可以不设置初值,或者赋予以下红色类型的初值。
	PHP中简单类型有8种,分别是:
	数值类型
	boolean 布尔类型
	integer整型
	float 浮点型,也称为 double 双精度浮点型
	string 字符串
	复合类型
	array 数组
	object对象
	特殊类型
	resource资源
	NULL
*/
Class A{
}
Class Person{
	private $name;//属性未赋值
	private $name1 = NULL;//属性赋空值,与未赋值一样
	private $married = true;//属性赋布尔类型的值
	private $grade = 0;//属性赋整型数值类型的值
	private $eyesight = 0.1;//属性赋值浮点类型
	private $nationality = "China";//属性赋值字符串类型
	private $arr = array("foo"=>"bar",12=>true);//属性赋值数组类型
	//private $a = new A();//php5中不允许给属性赋值为对象类型
	//private $res = opendir("abc");//php5中不允许使用资源类型
	//private $g = $this->grade;//不允许使用已经定义的属性为当前属性赋值
}
$p = new Person();
?>


<?
	//变量与引用变量
	$arr = array("foo"=>"olf",12=>true);
	$a = $arr;//对$a赋值
	
	$arr["foo"] = "new";//改变$arr中的值

	print_r($arr);
	echo "<br>";
	print_r($a);
	//我们可以看到改变一个数组的内容并没有影响另一个数组的内容。
	//这时由于普通变量间的传值方法,就是值的赋值。比如数组。
	echo "<br>";
	echo "<br>";
	//下面是关于对象间的引用
	class Person{
		public $name = "Tom";
	}
	$p1 = new Person();
	$p2 = $p1;//这里是传递引用

	$p2->name = "Jack";//改变p2中属性name的值

	echo '$p1的属性name = '.$p1->name;
	echo "<br>";
	echo '$p2的属性name = '.$p2->name;
	//输出结果都是Jack,说明$p1,$p2 是指向同一对象
	//而指向对象的变量,是一个引用变量。在这个变量里面存储的是所指向对象的内存地址。
	//引用变量传值时,传递的是这个对象的指向。而非复制这个对象。
?>


<?
//属性的扩充
/**
在类中使用$this-> 调用一个未定义的属性时,PHP5会自动创建一个属性供使用。
这个被创建的属性,默认的方法权限是public。
*/
class A{
	public $name="Tom";
	//类的构造函数,在对象创建的时候会自动调用
	function __construct(){
		$this->age="20";//调用一个不存在的属性
	}
}
$p = new A();
echo $p->name;
echo "<br>";
echo $p->age;
//这里我们看到age已经被创建了,而且是public的。
?>


<?
//php5中的方法
class Person{
	private $name = "NoName";//定义一个私有属性,这样外部不能能直接访问
	
	public function getName(){
		return $this->name;
	}
}
$p = new Person();

echo '名字是:'.$p->getName();

/**
上面的例子将属性设置为private ,同时声明了public的getName()方法,用来获取属性$name的值,
调用getName()方法就会通过 return $this->name 返回 $name 的值。
注意:这里,方法内部调用本地属性时,使用 $this->name来获取属性。在这个例子中,
设置了公开的getName()方法,即用户只能获取$name, 而无法改变他的值。这就是封装的好处。
*/
?>


<?
class Person{
	private $a;
	function setA($_a){
		$this->a=$_a;//对属性$a进行赋值
	}
	function getA(){
		return $this->a;//返回属性a的值
	}
}

$p = new Person();//创建对象
$p->setA(100);//属性赋值
echo $p->getA();
//如果声明这个方法有参数,而调用这个方法时没有传递参数,或者参数数量不足,
//系统会报出错误。 如 $p->setA(); 如果对函数设置了默认值 也可以如此调用可以看一下下一个例子
//如果参数数量超过方法定义参数的数量,PHP就忽略多于的参数。不会报错。如 $p->setA(100,10,12);
?>


<?
class Person{
	private $a;
	function setA($_a = "Tom"){
		$this->a = $_a;//对属性$a赋值,如果没有传递参数将用Tom代替
	}
	function getA(){
		return $this->a;//返回属性$a
	}
}
$p = new Person();
$p->setA();//没有显示的赋值
echo $p->getA();
?>


<?
//将对象作为参数传递进方法中
class A{ //声明一个A类
	public $name = "Tom";
}
class Person{
	private $a;
	function setA($_a){
		$this->a = $_a;
	}
	function getA(){
		return $this->a;
	}
}
$a1 = new A();
$p = new Person();
$p->setA($a1,null);//将对象作为参数传递进去,虽然不允许直接为属性赋对象类型,但可以通过参数传递的方式进行赋值
echo $p->getA()->name;//$p-getA()取得对象,->name是对象中的属性
//在PHP5中,指向对象的变量是引用变量。在这个变量里面存储的是所指向对象的内存地址。
//引用变量传值时,传递的是这个对象的指向。而非复制这个对象。
?>


<?
//对象比较

class Person{
	public $name = "noName";
}

$p = new Person();
$p1 = new Person();

/**
* 当使用比较操作符(==)时,对象以一种很简单的规则比较:当两个对象有相同的属性和值,
* 属于同一个类且被定义在相同的命名空间中,
* 则两个对象相等。等于符号比较对象时,比较对象是否有相同的属性和值。
* 注意:== 比较两个不同的对象的时候,可能相等也可能不等。
*/
if($p == $p1){
	echo '$p和$p1内容一致。';
}else{
	echo '$p和$p1内容不一致。';
}
echo "<br>";

$p->name = "Tom";
if($p == $p1){
	echo '$p和$p1内容一致。';
}else{
	echo '$p和$p1内容不一致。';
}
echo "<br>";
//使用 == 符号比较两个对象 ,比较的仅仅是两个对象的内容是否一致。
?>


<?
/**
* 对象比较
* 当使用全等符(===)时,当且仅当两个对象指向相同类(在某一特定的命名空间中)的同一个对象时才相等。
* 是否在是同一个对象,两边指向的对象是否有同样的内存地址。
* 结果=== 比较的是两个变量是否一个对象。
*/
class Person{
	public $name = "noName";
}

$p = new Person();
$p1 = new Person();

if($p === $p1){
	echo '$p和$p1是一个对象';
}else{
	echo '$p和$p1不是一个对象';
}
echo '<br>';

$p->name = "Tom";

if($p === $p1){
	echo '$p和$p1是一个对象';
}else{
	echo '$p和$p1不是一个对象';
}
echo '<br>';

?>


<?
class Person{
}

$p = new Person();
$p1 = new Person();

$p2 = $p1;//变量$p2指向$p1指向的对象

if($p2 === $p1){
	echo '$p2和$p1指向一个对象';
}else{
	echo '$p2和$p1不指向一个对象';
}
echo "<br>";

$p = $p1;//变量$p指向$p1指向的对象

if($p === $p1){
	echo '$p和$p1指向一个对象';
}else{
	echo '$p和$p1不指向一个对象';
}
echo "<br>";
?>


<?
//构造函数
/**
* 构造方法又称为构造函数,是对象被创建时自动调用的方法,用来完成类初始化的工作。
* 构造函数和其它函数一样,可以传递参数,可以设定参数默认值。
* 构造函数可以调用属性,可以调用方法。
* 构造函数可以被其它方法显式调用。
*/

//在PHP4 中使用与类名同名的方法为构造函数。在PHP5中依然支持了这种方式,
//但不建议再使用这种方式。
class Person{
	private $name;
	public function Person($name){
		$this->name = $name;
		echo "在类被初始化的时候,会执行这里的代码<br>";
		echo "\$name is $this->name <br>";
	}
}

new Person("Tom");
new Person("Jack");
echo "<br><br><br>";
//在PHP5中规定构造函数使用_ _construct() 函数表示构造函数,注意是两个 _ 。
//这也是推荐使用的方式
class Person2{
	private $name;
	public function __construct($name){
		$this->name = $name;
		echo "在类被初始化的时候,会执行这里的代码<br>";
		echo "\$name is $this->name <br>";
	}
}
new Person2("Tom2");
new Person2("Jack2");
?>


<?
/**
* 析构函数与PHP的垃圾回收机制
* 析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行。
*
* GC(Garbage Collector)
* 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁。
* 这是PHP的GC(Garbage Collector)垃圾处理机制,防止内存溢出。
* 当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中的所有对象同样被销毁。
*
* __destruct() 析构函数,是在垃圾对象被回收时执行。
* 析构函数也可以被显式调用,但不要这样去做。
* 析构函数是由系统自动调用的,不要在程序中调用一个对象的析构函数。
* 析构函数不能带有参数。
*/

//程序结束前,所有对象被销毁。
//析构函数被调用了。
class Person{
	public function __destruct(){
		echo "<br>析构函数在这里执行";
		echo "<br>这里一般用来放置关闭数据库连接,关闭文件等的首尾工作";
	}
}

$p = new Person();
for($i=0;$i<5;$i++){
	echo "<br>$i";
}

//这里php程序结束 对象销毁。
?>


<?
//当对象没有指向时,对象被销毁。
class Person{
	public function __destruct(){
		echo "<br>析构函数在这里执行<br>";
	}
}

$p = new Person();
$p = null;//对象没有引用,被销毁,析构函数执行
//$p = "abc";//同样效果
//我们将$p设置为空或者第11行赋予$p一个字符串,这样$p之前指向的对象
//就成为了垃圾对象。PHP将这个对象垃圾销毁。
echo "我们看到,析构函数被执行了";
for($i = 0;$i<5;$i++){
	echo "<br>$i";
}
?>


<?
//unset变量
//unset一个引用变量时。
//unset 销毁的是指向对象的变量,而不是这个对象。
class Person{
	public function __destruct(){
		echo "<br>析构函数在这里执行<br>";
	}
}
$p = new Person();
$p1 = $p;//设定新引用变量$p1与$p指向同一对象

unset($p);
echo "是否看到\$p被销毁,对象也被销毁呢?";

for($i = 0 ; $i<5 ;$i++){
	echo "<br>$i";
}

unset($p1);//这里彻底没有指向对象的变量了。
echo "我们看到,析构函数被执行,对象也被销毁呢?";
?>


请看实例部分
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics