在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
对象具有重要的两个特性,分别是属性和行为。比如一只狗,狗的大小,种类,毛色是其属性,奔跑,进食,咬人是其行为。在编程语言中一般有类和对象的分别,类是一种事物概念的集合,而对象则是具体的事物。举个例子,有一个汽车模型Car,工厂根据这个模型制作了3辆汽车,car1,car2,car3,那么汽车模型Car是类,具体的car1就是类的对象。以上的例子可能有所偏颇,主要是帮助理解。
类的定义
语法规则:
- 类使用 class 关键字后加上类名定义。
- 类名后的一对大括号({})内可以定义变量和方法。
- 类的变量使用 var 来声明, 变量也可以初始化值。
- 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。
比如:
class OneClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
#some code
}
}
对象的创建
<?php
//PHP_EOL="\n";
class OneClass {
var $var1;
var $var2 = "constant string";
function myfunc () {
echo "class".PHP_EOL;
}
}
$aclass=new OneClass();
$aclass->myfunc();
$bclass=new oneclass;
$bclass->myfunc();
echo $bclass->var2;
?>
结果:
class
class
constant string
对象的创建可以用new 关键字+类名[()],类的类名和方法名是不区分大小写的。方法使用类变量->方法名()来调用。属性使用类变量->变量名来调用。
类的属性可以手动删除
unset($bclass->var2);
echo $bclass->var2;
if(!isset( $bclass->var2)){
echo "属性已被删除";
}
属性已被删除
对象的存储
栈区放对象引用,堆区放对象内容,有代码区和静态属性和常量区。
在PHP5的Zend Engine的实现中,所有的值都是在堆上分配空间,并且通过引用计数和垃圾收集来管理.
PHP5的Zend Engine主要使用指向zval结构的指针来操作值,在很多地方甚至通过zval的二级指针来操作.
而在PHP7的Zend Engine实现中,值是通过zval结构本身来操作(非指针).新的zval结构直接被存放在VM的栈上,HashTable的桶里,以及属性槽里.
这样大大减少了在堆上分配和释放内存的操作,还避免了对简单值的引用计数和垃圾收集
PHP构造函数
构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。
PHP5允许开发者在一个类中定义一个方法作为构造函数,例如:
class Test
{
function __construct($par1, $par2)
{
$this->url = $par1;
$this->title = $par2;
}
function display(){
echo $this->url," 是",$this->title;
}
}
$test1=new Test("blog.shadowwu.club","影梧的博客");
$test1->display();
结果:
blog.shadowwu.club 是影梧的博客
$this是只类的对象本身,PHP不能重载,故构造方法只能有一个,但是PHP的函数参数不是固定的,所以以下方法可以实现构造方法重载。
class Override
{
function __construct()
{
$num =func_num_args();
switch ($num)
{
case 0:
echo "none ";
break;
case 1:
echo "one ";
break;
case 2:
echo "two ";
break;
}
}
}
new Override() ;
new Override(1);
new Override(1,2);
结果:
none one two
PHP可变参数个数
…$args代替任意数量参数
<?php
function myfunc(...$args){
// 获取参数数量
echo count($args).PHP_EOL;
// 获取第一个参数的值:
print_r($args[0]);
echo PHP_EOL;
// 获取所有参数的值
print_r($args);
echo PHP_EOL;
}
myfunc('a');
myfunc(1, 2, 3);
myfunc(array('d','e'), array('f'));
?>
数组转为参数列表
<?php
function add($a, $b){
echo $a + $b;
}
$args = array(1, 2);
add(...$args); // 输出3
?>
部分参数指定,其他参数数量不定
<?php
function display($name, $tag, ...$args){
echo 'name:'.$name.PHP_EOL;
echo 'tag:'.$tag.PHP_EOL;
echo 'args:'.PHP_EOL;
print_r($args);
echo PHP_EOL;
}
display('fdipzone', 'programmer');
display('terry', 'designer', 1, 2);
display('aoao', 'tester', array('a','b'), array('c'), array('d'));
?>
析构函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
<?php
//PHP_EOL="\n";
class Test
{
function __construct($par1, $par2)
{
$this->url = $par1;
$this->title = $par2;
}
function __destruct()
{
echo "对象销毁";
}
}
$test1=new Test("blog.shadowwu.club","影梧的博客");
unset($test1);
echo "结束";
?>
结果:
对象销毁结束
手动销毁对象,调用析构函数,如果不销毁的话,文件执行完毕自动销毁对象,调用析构函数。