>  기사  >  백엔드 개발  >  PHP 기본 튜토리얼 9개 클래스 및 객체

PHP 기본 튜토리얼 9개 클래스 및 객체

黄舟
黄舟원래의
2017-03-01 09:54:431465검색

이 섹션에서 설명하는 내용

  • 클래스 및 객체

  • 구성 클래스

  • 객체 생성

  • PHP 가비지 수집 메커니즘

  • $이 설명

서문

PHP는 객체지향 프로그래밍 언어인데 객체지향이란 무엇일까요? 우리는 왜 객체지향이어야 하는가? 우리 삶에는 컵, 상자 등 사물인 것들이 많이 있습니다. 그것들은 모두 고유한 특성을 갖고 있으며 모두 사물입니다. 그리고 우리의 개발 개발 역시 객체 지향 프로그래밍을 기반으로 합니다. 객체는 가장 단순한 정수부터 복잡한 비행기에 이르기까지 사람들이 연구하고 싶어하는 모든 것입니다. 객체 지향 프로그래밍을 사용하면 문제를 포괄적으로 볼 수 있으며 데이터 관리 및 유지 관리에도 도움이 됩니다. PHP에서 객체 지향 프로그래밍은 두 가지 범주로 나눌 수 있습니다. 하나는 객체를 생성하는 모델입니다. , 다른 하나는 모델을 사용하여 생성된 객체인데 둘 사이의 관계는 무엇입니까?

클래스와 객체

클래스와 객체: 동일한 특성(데이터 요소)과 동작(함수)을 가진 객체를 추상화한 것이 클래스입니다. 따라서 객체의 추상화는 클래스이고, 클래스의 구체화는 객체이며, 클래스의 인스턴스는 객체이며, 클래스는 실제로 데이터 유형이라고 할 수도 있습니다.

즉, 객체의 기능과 특성을 추출하여 클래스를 구성하는 것은 컵의 모델을 추출하는 것과 같으며, 이 모델을 기반으로 다양한 컵(일명 컵)을 만들 수 있습니다. 즉, 클래스)가 객체입니다.
그럼 클래스는 어떻게 정의되나요? 객체는 어떻게 생성되나요?

클래스 구성

rree

위는 클래스의 기본 구조입니다. 아래에서는 각 부분의 의미를 자세히 설명하겠습니다.

  • class는 키워드이며 수정할 수 없으므로 클래스임을 나타냅니다.

  • Cat은 클래스 이름입니다. 클래스 이름은 대문자로 시작하여 카멜 케이스로 명명됩니다.

클래스 속성

속성: 멤버 속성은 클래스의 구성 요소이며 일반적으로 기본 데이터 유형(정수, 문자열 등)입니다. 복합 유형(객체, 배열), 리소스 유형일 수도 있습니다. 예를 들어 앞서 정의한 Cat 클래스의 공개 $age는 멤버 속성입니다.

각 클래스에는 속성이 있다고 할 수 있습니다. 예를 들어 고양이는 클래스의 공통된 특성인 이름, 나이, 색깔 등을 가질 수 있습니다. 고양이. 클래스에서 이 기능을 속성이라고 부릅니다. 물론 속성을 정의할 필요는 없습니다. 이는 귀하의 필요에 따라 다릅니다.

속성 앞의 public은 권한 수정자인데 이에 대해서는 나중에 설명하겠습니다.

멤버 메소드(함수)

위 코드를 보면 클래스에 여러 함수가 있는 것을 알 수 있지만, 이전 함수와 동일합니다. 앞에 추가 권한 제어 문자가 있습니다. 멤버 메소드라고도 합니다. 이러한 멤버 메소드는 클래스의 동작입니다. 예를 들어 위의 cat 클래스에는 자고 먹는 동작이 있습니다. 물론 자체적으로 작성할 수도 있습니다.

멤버 메서드 구문:

<?php

    class Cat{ //定义一个猫类
        public $name; //猫的名字
        public $age;//猫的名字
        public $color;//猫的颜色
        //猫的构造方法
        public function __construct(){

        }

        public function sleep(){
            echo &#39;猫睡觉&#39;;
        }

        public function eat(){
            echo &#39;猫吃饭&#39;;
        }

    }
  • 액세스 한정자, 세 가지 유형(public, protected, privte)이 있으며 기본값은 public이므로 자세히 설명하겠습니다. 나중에

  • 호출 메커니즘을 포함하여 다른 부분은 우리가 배운 기능과 동일합니다

  • 매개변수 목록은 여러 개를 가질 수 있으며 모든 유형

  • 메서드의 반환 값은 특정 요구 사항에 따라 달라질 수 있습니다.

  • 멤버 메소드는 클래스 내에 정의되어 있습니다. 클래스 외부에서 정의되면 이 클래스의 동작이 아닙니다.

생성자

위의 cat 클래스에 메소드가 있는데, 메소드 이름이 -__construct() 이므로 생성자이므로 생성자란 무엇입니까? 생성자는 객체를 생성할 때 데이터를 초기화하는 방법입니다. 예를 들어 객체 생성 시 고양이의 이름, 나이, 색상을 직접 부여하고 싶다면 생성자를 사용하면 됩니다.

访问修饰符  function  函数名(形式参数){
    //函数体;
    //return 返回值;
}

생성자의 구문은 다음과 같습니다.

public function __construct($name,$age,$color){
            $this-> name = $name;
            $this-> age = $age;
            $this-> color = $color;
}

생성자 __construct()의 메서드 이름에 대해 이것은 나중에 소개할 마법의 메서드입니다. 생성자의 메소드 이름은 클래스의 이름입니다:

public  function  __construct(形式参数){  
    //函数体
}

위의 생성자 메소드 정의 방법도 맞지만 매직 메소드(__construct( )), 클래스 이름이 변경되면 수정할 필요가 없다고 생각합니다.

참고PHP의 클래스 이름은 대소문자를 구분하지 않습니다. 하지만 여전히 대문자와 소문자로 작성해야 합니다. 동시에 생성자에는 반환 값이 없습니다.

생성자는 다음 사항에 주의해야 합니다.

  • 클래스에는 생성자가 하나만 있을 수 있으며 이는 필수 요구 사항입니다.

  • 생성자는 시스템에 의해 자동으로 호출되므로 직접 조정할 필요가 없습니다.

  • 생성자를 정의하지 않으면 시스템은 다음 형식의 기본 생성자를 사용합니다. public function

  • __construct(){ }, 따라서 생성자를 정의했는지 여부에 관계없이 생성자가 있습니다.

上面的三种情况就是类中大致的内容,在后续我们还会降类中的其他情况。

对象的创建

在上面创建对象的类已经有了,那么怎么创建对象呢?

对象创建方法

$cat = new Cat();

创建对象的语法是:

$对象名 = new 类名(参数1,参数2);

类名后面的括号里的参数是传递给类的构造函数的,如果构造函数没有参数,可以不写。

  • 对象的命名规范和普通变量一样,使用驼峰法或者下划线法均可

  • new也是一个关键字,不能修改,表示新创建对象

我们创建对象的目的就是需要操作对象,而操作对象,就是操作对象里面的属性和方法。

在上面的类下面写如下代码:

//创建对象,传递三个参数到构造函数。
$cat = new Cat(&#39;小花&#39;,12,&#39;black&#39;);
//通过对象来访问对象的属性
echo $cat -> name;
echo &#39;<br>&#39;;
echo $cat -> age;
echo &#39;<br>&#39;;
echo $cat -> color;
echo &#39;<br>&#39;;
$cat-> sleep();
$cat-> eat();
.....结果......
小花
12
black
猫睡觉
猫吃饭

上面的对象通过->访问属性和方法。注意属性的前面没有$符号

$对象名->属性名= 值;
echo  $对象名->属性名;
&#39;-> &#39; 称为对象运算符.

上面的就是对象的创建和最基本的应用

对象的传递类型

当我们把对象的值赋给另外一个变量是,是值传递还是引用传递?

    //创建一个对象
    $cat = new Cat(&#39;小花&#39;,12,&#39;black&#39;);
    $cat1 = $cat; // 把$cat这个对象赋给$cat1;
    $cat1 -> name = &#39;小白&#39;;//利用$cat1这个对象修改对象的名字。
    echo $cat1 -> name; //输出$cat1对象的名字。
    echo &#39;<br>&#39;;
    echo $cat -> name; //输出$cat对象的名字。
.....结果......
小白
小白

看到这里可能有点蒙,不是值传递吗?怎么修改一个对象的属性,另外一也变了?,

上面的代码当中 $cat1=$cat也是值传递,但是这个值是对象的引用(可以理解对象标识符),即每个包含对象的变量都持有对象的引(reference),而不是整个对象的拷贝。

PHP 기본 튜토리얼 9개 클래스 및 객체

在上面的图中可以看到,当$cat赋值给$cat1时,也就是对象标识符(#1)复制了一份,赋给$cat1,其实他们还是指向同一块数据区,所以只要其中一个修改了值,另外一个也会变。

对象的销毁

我们使用完对象后,已经确定在以后不会使用这个对象了,这个时候我们可以手动的销毁对象,那么我们怎么让对象销毁呢?

  1. 当没有任何变量指向对象时,会销毁,因此我们可以把对象引用置为null

  2. 使用unset()函数来销毁对象。

    //创建一个对象
    $cat = new Cat(&#39;小花&#39;,12,&#39;black&#39;);
    $cat -> sleep();
    unset($cat);
    $cat -> sleep();
    .....结果.....
    
    猫睡觉
    Notice: Undefined variable: cat in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27
    
    Fatal error: Call to a member function sleep() on null in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27

    其实在一个文件运行完的时候,PHP会启动垃圾回收机制,自动的进行垃圾回收。这时候在里面创建的对象就自动销毁了,那么什么是PHP的垃圾回收机制?

PHP垃圾回收机制

垃圾回收,顾名思义,回收垃圾的,在程序中启动垃圾回收机制的时机:

  • 在php中,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,php将启动垃圾回收器将对象销毁。

  • 当程序退出前,php也将启用垃圾回收器,销毁对象。

那么什么是垃圾回收机制?

垃圾回收机制是php5之后才有的,php5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。但是PHP5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在(对象的相互引用),以避免内存泄漏。

$this说明

在上面写类的构造函数的时候,可以看到在函数中使用到了$this,那么在面向对象中$this是什么?

$this是在类中使用的访问自身的一种机制。系统会给每个对象分配$this,代表当前对象。通俗的说就是在当前环境下,谁调用,$this就代表哪个对象。

<?php

    class Cat{ //定义一个猫类
        public $name; //猫的名字
        public $age;//猫的名字
        public $color;//猫的颜色
        //猫的定义方法
        public function Cat($name,$age,$color){
            $this-> name = $name;
            $this-> age = $age;
            $this-> color = $color;
        }

        public function sleep(){
            echo &#39;猫睡觉<br>&#39;;
        }

        public function eat(){
            echo &#39;猫吃饭<br>&#39;;
        }
        //输出猫的信息
        public function info(){
            echo &#39;猫的名字是&#39; . $this -> name . &#39; 年龄是&#39; . $this-> age . &#39; 颜色是&#39; . $this-> color;
        }

    }
    //创建一个对象
    $cat = new Cat(&#39;小花&#39;,12,&#39;black&#39;);
    $cat -> info();
    echo &#39;<br>&#39;;
    //创建另一个对象,传进不同的属性
    $cat1 = new Cat(&#39;小白&#39;,6,&#39;white&#39;);
    $cat1 -> info();
    .....结果.....
猫的名字是小花 年龄是12 颜色是black
猫的名字是小白 年龄是6 颜色是white

在上面的类中的info()函数中使用$this,不同的对象输出不同的结果,因为在不同的环境下,谁调用,$this就代表哪个对象。

类的析构函数

在上面我们提到过,对象的销毁,其实在类中有一个方法,就是在对象销毁的时候由系统自动执行的。我们称之为析构函数。

public function __destruct(){
        echo $this->name . &#39;被销毁了<br>&#39;;
}

在PHP5中引入了析构函数的概念,析构函数会在某个对象的所有引用被删除(没有变量指向对象,要被销毁了),对象销毁前执行。

析构函数的主要作用是去释放对象分配的相关资源,比如数据库连接或打开的文件等。

它的语法是:

function  __destruct(){
    //函数体[释放资源,比如数据库连接,或者打开文件等等]
}

析构函数也是系统自动调用的,我们不用自己调。但是当我们没有写析构函数的时候,系统不会执行析构函数。

<?php

class Cat{ //定义一个猫类
    public $name; //猫的名字
    public $age;//猫的名字
    public $color;//猫的颜色
    //猫的定义方法
    public function Cat($name,$age,$color){
        $this-> name = $name;
        $this-> age = $age;
        $this-> color = $color;
    }

    public function sleep(){
        echo &#39;猫睡觉<br>&#39;;
    }

    public function eat(){
        echo &#39;猫吃饭<br>&#39;;
    }
    //输出猫的信息
    public function info(){
        echo &#39;猫的名字是&#39; . $this -> name . &#39; 年龄是&#39; . $this-> age . &#39; 颜色是&#39; . $this-> color;
    }

    public function __destruct(){
        echo $this->name . &#39;被销毁了<br>&#39;;
    }

}
//创建一个对象
$cat = new Cat(&#39;小花&#39;,12,&#39;black&#39;);
echo $cat -> name; //输出对象的名字
echo &#39;<br>&#39;;
unset($cat); //销毁对象,系统自动调用析构函数。
.....结果......
小花
小花被销毁了

当我们销毁对象$cat时,析构函数自动执行。

  • 소멸자는 객체가 소멸되기 전에 자동으로 실행되며 반환 값이 없습니다. 클래스에는 소멸자가 하나만 있을 수 있습니다.

  • 소멸자는 객체 자체가 아닌 객체가 생성한 리소스를 파괴하며, 이는 가비지 수집 메커니즘에 의해 파괴됩니다.

파일에 여러 개의 객체를 생성할 때 파일이 실행되어 객체가 소멸되면 먼저 생성된 객체가 먼저 소멸되고 나중에 생성된 객체가 먼저 소멸됩니다. 스택의 원리와 원리는 선입선출, 후입선출, 선입선출, 매우 유사합니다.

요약

위의 클래스와 객체에 대한 설명을 통해 클래스와 객체의 차이점과 연관성을 알 수 있다. 클래스는 추상적이고 고양이와 같은 유형을 나타냅니다. 객체는 구체적이며 특정 사물을 나타냅니다. 클래스는 객체의 템플릿이고 객체는 클래스의 인스턴스입니다. 동시에 수업의 기본 구성도 마스터해야 합니다.

위 내용은 PHP 기본 튜토리얼 9과 객체 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.