PHP的类详解一

在面向对象的程序设计(英语: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 "结束";


?>

结果:

对象销毁结束

手动销毁对象,调用析构函数,如果不销毁的话,文件执行完毕自动销毁对象,调用析构函数。

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注