`

面向对象设计 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 "我们看到,析构函数被执行,对象也被销毁呢?";
?>


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

相关推荐

    面向对象设计 2 —— PHP5面向对象基础(实例部分)

    这篇博客“面向对象设计 2 —— PHP5面向对象基础(实例部分)”可能详细讲解了如何在PHP5中应用面向对象编程的基本原理和实践。在本文中,我们将深入探讨这些关键知识点,并结合提供的文件名,推测其可能包含的具体...

    面向对象设计 4 —— PHP5面向对象进阶(属性的访问控制)

    这篇博客“面向对象设计 4 —— PHP5面向对象进阶(属性的访问控制)”着重讲解了如何在PHP5中通过访问控制来保护类的内部状态,确保代码的封装性和安全性。 在PHP5中,我们可以为类的属性设置三种访问修饰符:public...

    面向对象设计 5 —— PHP5面向对象进阶(重写(override))

    面向对象设计是编程领域中的一个重要概念,特别是在PHP5及更高版本中得到了显著强化。本教程主要探讨PHP5的面向对象进阶特性,特别是类的重写(Override)机制。通过以下列出的源码文件,我们可以深入理解这一概念。...

    面向对象设计 6 —— PHP5面向对象进阶(关键字 this)

    面向对象设计是编程领域中的一个重要概念,特别是在PHP5中,它引入了丰富的面向对象特性,使得PHP成为了一种更加强大的面向对象编程语言。本文将深入探讨PHP5中的"this"关键字,它是面向对象编程中一个至关重要的...

    面向对象设计 3 —— PHP5面向对象进阶(类的继承)

    在PHP5中,面向对象编程(Object-Oriented Programming,OOP)是现代Web开发中的核心概念,极大地提升了代码的可读性、可维护性和复用性。本篇将深入探讨PHP5中的类的继承这一关键特性,以及如何在实际项目中应用。 ...

    php面向对象——记忆卡

    标题和描述概述的知识点主要集中在PHP面向对象编程的基础概念、应用以及高级特性上。下面将对这些知识点进行详细的解析和扩展。 ### PHP面向对象编程概览 PHP是一种广泛使用的脚本语言,支持多种编程范式,包括...

    23种 设计模式---面向对象的基本原则

    在面向对象编程中,设计模式基于一些基本原则,这些原则构成了良好设计的基础。本篇将深入探讨23种设计模式以及面向对象的基本原则。 面向对象的基本原则主要包括: 1. 单一职责原则(Single Responsibility ...

    深入PHP++面向对象、模式与实践_2017英文版+最新中文版(附源码)

    总之,《深入PHP++面向对象、模式与实践》是一本全面介绍PHP面向对象编程的宝典,无论是初学者还是有经验的开发者,都能从中受益匪浅,提升自己的PHP编程技能。附带的源码可以帮助读者更好地理解书中的示例,加深对...

    php简单面向对象的网站例子

    $news1 = new News("PHP面向对象教程", "这是一个关于PHP OOP的教程"); $news1-&gt;display(); ``` 这里,`$news1`就是一个`News`类的对象,我们通过调用其`display`方法来显示新闻。 面向对象的三大特性——继承、...

    PHP专题——重点函数_静态化_缓存_面向对象_异常处理

    综上所述,PHP专题涵盖了从基础到高级的关键知识点,包括重要函数的选择性解析、面向对象编程的深入理解、异常处理的应用以及静态化和缓存技术,旨在帮助开发者全面掌握PHP的核心技能,以适应不断发展的Web开发需求...

    php5面向对象

    面向对象编程是一种程序设计范式,强调数据和操作这些数据的方法应该封装在一起,形成独立的实体——对象。下面我们将深入探讨PHP5的面向对象基础、进阶概念以及高级类特性。 ### 1. 面向对象基础 #### 类与对象 -...

    PHP5手册——PHP大全

    《PHP5手册——PHP大全》是一本全面且深入的PHP编程指南,专为初学者和经验丰富的开发者设计。这本书以CHM(Compiled HTML Help)格式呈现,这种格式以其高效的检索和阅读体验而受到程序员的欢迎。书中内容清晰,...

    PHP面向对象编程(用星际快速入门)

    ### PHP面向对象编程详解——以星际争霸为例 #### 一、引言 在现代软件开发中,面向对象编程(Object-Oriented Programming, OOP)是一种广泛应用的技术,它通过将程序设计围绕“对象”来进行组织,使代码更易于...

    面向对象的编程思想.rar

    1. 封装:这是面向对象编程的核心特性之一,它隐藏了对象内部的实现细节,只对外提供接口进行交互。这样可以保护数据不被外部随意访问,提高程序的安全性和稳定性。 2. 继承:继承允许一个类(子类)从另一个类...

    thinkphp, ThinkPHP3.2 ——基于PHP5的简单快速的面向对象的PHP框架.zip

    这个框架基于PHP5,以简洁、快速和面向对象为设计原则,旨在提高开发效率,降低项目维护成本。在深入讲解ThinkPHP3.2的知识点之前,先了解一下它的一些核心特性。 1. **MVC模式**:ThinkPHP3.2采用模型-视图-控制器...

    php初级编程的例子,面向对象的封装很适合

    下面是一些关于PHP面向对象封装的基本概念: 1. 类(Class):类是创建对象的模板,它定义了对象的状态(属性)和行为(方法)。在PHP中,我们使用`class`关键字来声明一个类,如: ```php class Person { ...

    我的PHP学习之旅——PHP基础知识汇总.zip

    在PHP的世界里,初学者经常会遇到许多概念和技巧,这些都在你所提到的"我的PHP学习之旅——PHP基础知识汇总.zip"文件中有所涵盖。这个压缩包可能是你学习PHP的宝贵资源,包含了从基础到进阶的各类知识点。下面,我将...

    PHP设计模式-面向对象开发必备

    **PHP设计模式——面向对象开发的核心知识** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的经验总结。PHP作为一种广泛应用于Web开发的动态类型语言,同样可以运用设计模式来提升代码的...

Global site tag (gtag.js) - Google Analytics