`
cyxlgzs
  • 浏览: 90049 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

PHP实践之路(八)类与对象(1)

 
阅读更多

PHP实践之路(目录索引)

类与对象(1)

类与对象的知识点较多,我们这里将分几篇文章来分别阐述

1、概述

a、类的定义以class为关键字,类名可以是任何非PHP保留字的名字。类的实体内容定义在一对花括号内部,模型如下

class 类名{
    statement...
}

b、伪变量 $this 可以在当一个方法在对象内部调用时使用。$this 是一个到调用对象的引用

c、self在类内部代表类本身

d、创建一个类的实例用new关键字

e、PHP当中对象是按引用传递的

f、当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样

根据以上知识点,我们做如下实验

<?php
//换行输出
function println($var){
	echo $var;
	echo "<br />";
}	
//定义一个类Person
class Person{
	private $name = "jack";
	static $category="chinese";
	
	public function getName(){
		return $this->name;		//$this为变量的使用
	}
	
	public function setName($name){
		$this->name=$name;		//这里如果用$name = $name;的话将不会对成员变量$name有任何的影响
	}
	
	public function getCategory(){
		return self::$category;		//访问静态变量,这里和使用Person::$category是一样的结果,但在类内部最好使用self,因为当类名发生变化时,用self就不用改代码了
	}
}

$p1 = new Person();				//使用new来创建一个对象
println($p1->getName());		//jack

$p2 = $p1;						//对象赋值,$p2访问的实例将指向$p1指向的对象
println($p2->getName());		//jack

$p3 = &$p1;						//引用赋值,$p3指向$p1
println($p3->getName());		//jack

$p1->setName("lucy");

println($p1->getName());		//lucy
println($p2->getName());		//lucy
println($p3->getName());		//lucy

$p1 = NULL;						//$p1和$p3将都为null,$p2还指向了刚开始创建的那个对象

var_dump($p1);			//null
var_dump($p2);
/*
object(Person)[1]
  private 'name' => string 'lucy' (length=4)
*/
var_dump($p3);			//null


println($p2->getCategory());	//chinese

//此处虽然按值传递,但由于是对象,所以为引用传递
function changeName($obj){
	$obj->setName("lily");	//将改变对象的$name
}

changeName($p2);

println($p2->getName());		//lily

?>

2、成员变量

a、类的成员变量也可以叫做类的属性、字段和特征等,它表示了一个类数据有的属性,也就是数据

b、在成员变量的前面添加关键字public、protected 或private来达到成员变量的访问控制。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问

c、为了兼容php4,php5声明属性依然可以直接使用关键字var,或者放在public, protected, orprivate之前。但是var并不是必须的。在php 5.0 到5.1.3,var会认为是废弃的, 而且抛出E_STRICT警告,但是5.1.3之后就不再认为是废弃,也不会抛出警告。 如果直接使用var声明属性,而没有public,protected, 或 private,php 5 会认为这个属性为public

d、在类的成员方法里面,可以通过$this->property这种方式来访问类的属性,但是要访问类的静态属性里面却不能使用,而是使用self::$property

e、类成员都必须使用关键字public、protected 或 private 进行定义

f、在定义类成员方法时,不添加访问控制修饰符时默认为public

实验时间

<?php
//换行输出
function println($var){
	echo $var;
	echo "<br />";
}	
//定义一个类Person
class Person{
	static $category = "chinese";	//类别,静态变量
	private $age = 10;				//年龄,私有变量			
	public $name = "jack";				//年龄,公开变量
	var $work = "";					//工作,用var申明的变量为public
	
	//内部获取类别
	public function getCategory(){
		return self::$category;		//此处若用$this->category将报错
	}
	//内部获取年龄
	public function getAge(){
		return $this->age;
	}
}

println(Person::$category);		//类外部获取类的静态变量,输出chinese

$p = new Person();				//创建一个对象
println($p->getCategory());		//chinese

println($p->name);				//外部访问公开变量,输出jack

//println($p->age);				//外部返给私有变量,报错Fatal error: Cannot access private property Person::$age

println($p->getAge());			//通过公开方法getAge()来获取对象的私有属性age,输出10
?>


3、类常量

a、类常量的值将始终保持不变。在定义和使用常量的时候不需要使用$符号,使用const关键字来定义类常量

b、PHP5.3.0之后,我们可以用一个变量来动态调用类。但该变量的值不能为关键字self, parentstatic

实验一下

<?php
//换行输出
function println($var){
	echo $var;
	echo "<br />";
}	
//定义一个类Person
class Person{
	const CLASS_NAME="Person";	//定义一个类常量
	
	function getVal(){
		return self::CLASS_NAME;	//类内部访问常量,此处也可以用$this::CLASS_NAME
	}
}

println(Person::CLASS_NAME);	//类外部访问常量,输出Person
$p = new Person();
println($p::CLASS_NAME);		//使用对象访问常量,输出Person

println($p->getVal());		//输出Person

$val="Person";

println($val::CLASS_NAME);		//变量来动态调用类,输出Person
?>


版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics