> 백엔드 개발 > PHP 튜토리얼 > PHP 객체지향에 대한 실무적 기본지식

PHP 객체지향에 대한 실무적 기본지식

炎欲天舞
풀어 주다: 2023-03-14 16:14:01
원래의
1635명이 탐색했습니다.


1. 객체지향의 기본

객체 지향

1. 클래스란 무엇인가요?
동일한 속성(특성)과 방법(행동)을 가진 일련의 개체 집합입니다. 클래스는 추상적인 개념입니다.

2. 객체란 무엇인가요?
클래스에서 얻은 특정 속성 값을 가진 개체를 객체라고 합니다. 대상은 특정 개인입니다.
예: 인간; 장산

3. 클래스와 객체의 관계는 무엇인가요?
클래스는 객체의 추상화입니다! 객체는 클래스의 구체화입니다!
클래스는 이 유형의 객체가 어떤 속성을 가지고 있는지 나타낼 뿐이며 특정 값을 가질 수 없으므로 클래스는 추상적입니다.
객체는 클래스의 모든 속성을 할당한 후 생성되는 특정 개체입니다.

II 클래스 선언 및 인스턴스화

1. 클래스 선언 방법:

클래스 클래스 이름 {
액세스 수정자 $property [=기본값] 값 ];
[접근 한정자] function method (){}
}

2. 클래스 선언 시 주의 사항:
①클래스 이름은 영숫자와 밑줄로만 구성할 수 있으며, 숫자로 시작할 수 없습니다.
클래스 이름은 클래스로 수정해야 하며, 클래스 이름 뒤에 ()가 있어서는 안 됩니다.
③ 속성에는 액세스 수정자가 있어야 하며, 메서드에는 액세스가 없어도 됩니다. 수정자.

3. 인스턴스화된 객체 및 객체 속성 메서드 호출:
$object name = 새 클래스 이름 (); //()는

클래스 외부에서 속성 및 메서드 호출 없이 호출할 수 있습니다.
$Object name-> $Attribute name; //->를 사용하여 속성을 호출하는 경우 속성 이름에는 $ 기호가 포함될 수 없습니다.

클래스 내에서 속성 및 메소드 호출:
$ this -> $ 속성 이름;

ThreeConstructor

1. 생성자란?
생성자는 클래스의 특수 함수입니다. new 키워드를 사용하여 객체를 인스턴스화하는 것은 클래스의 생성자를 호출하는 것과 같습니다.

2. 생성자의 기능은 무엇인가요?
객체를 인스턴스화할 때 자동으로 호출되어 객체의 속성에 초기값을 할당하는 데 사용됩니다!

3. 생성자 작성 방법:
①생성자 이름은 클래스 이름과 동일해야 합니다
[public] function Person($name){
$this -> = $name;
}
②매직 메소드 사용 __construct
[public] function __construct($name){
$this -> name = $name;
}
4. 생성자 주의 사항 :
① 첫 번째 작성 방법은 생성자 이름이 클래스 이름과 동일해야 합니다! ! ! !
②클래스에 직접 작성한 생성자가 없으면 시스템에는 기본적으로 null 매개 변수 생성자가 있으므로 new Person()을 사용할 수 있습니다.
매개 변수가 있는 생성자를 작성하면 더 이상 null이 없습니다. 매개변수 생성, 즉 new Person()은 직접 사용할 수 없습니다.
Person은 생성자의 요구 사항을 충족해야 합니다. ! ! !
③두 생성자가 동시에 존재하는 경우 __construct가 사용됩니다.

5. 소멸자: __destruct():
① 소멸자는 객체가 파괴되고 해제되기 전에 자동으로 호출됩니다.
② 소멸자는 어떤 매개 변수도 사용할 수 없습니다. 개체가 사용된 후에는 리소스 등을 닫습니다.
6. 마법의 방법:

PHP는 __로 시작하는 일련의 함수를 제공합니다. 이러한 함수는 수동으로 호출할 필요가 없습니다.
이러한 유형의 함수는 자동으로 호출됩니다. 매직을 매직 기능이라고 합니다.
예: 새 객체가 생성되면 __construct(){} 함수가 자동으로 호출됩니다.
객체가 삭제되면 __destruct(){} 함수가 자동으로 호출됩니다.

마술 외에도 다음이 필요합니다. 메소드, 자체 정의 함수 및 메소드는 __로 시작할 수 없습니다.


마지막으로 일반적으로 더 복잡한 기능을 가진 클래스의 경우 별도의 클래스 파일에 작성합니다.

클래스 파일명은 동일한 소문자여야 하며, "클래스명 소문자.class.php" 방법을 이용하세요.

이 클래스를 다른 파일에서 사용할 때 include를 사용하여 이 ".class.php" 파일을 가져올 수 있습니다.

2. 캡슐화 및 상속

1. 포장이란?
액세스 제어를 달성하기 위해 외부 액세스가 필요하지 않은 클래스의 속성과 메서드를 액세스 한정자를 사용하여 사유화하세요.

*참고: 접근을 거부하는 것이 아니라 접근 제어를 구현하기 위한 것입니다. 즉, 속성을 사유화한 후, 우리가 제공하는 방법을 통해 사용자가 속성을 처리할 수 있도록 해당 방법을 제공해야 합니다.

2. 캡슐화의 역할은 무엇인가요?
① 사용자는 클래스가 제공할 수 있는 기능에만 관심이 있고, 기능 구현의 세부적인 내용에는 관심이 없습니다! (Encapsulation 방식)
②사용자의 데이터를 제어하고, 불법적인 데이터의 설정을 방지하며, 사용자에게 반환되는 데이터를 제어합니다. (속성 encapsulation + set/get 방식)

3. encapsulation 연산을 구현할까요?
①메소드 캡슐화
클래스 내부에서만 사용되며 외부 사용을 위해 제공되지 않는 일부 메소드의 경우 프라이빗을 사용하여 해당 메소드를 사유화할 수 있습니다.


private function formatName(){} //这个方法仅仅能在类内部使用$this调用
function showName(){
    $this -> formatName();
}
로그인 후 복사

②속성 캡슐화 + 설정/가져오기 메서드
속성 설정 및 읽기를 제어하기 위해 속성을 비공개화하고 사용자가 우리가 제공하는 설정/가져오기 메서드를 통해 속성을 설정하도록 요구할 수 있습니다.


 private $age;
 //set方法
 function setAge($age){
     $this->age=$age;
 }
 //get方法
 function getAge(){
     return $this->age;
 }
로그인 후 복사

$Object->getAge();
$Object->setAge(12);

3속성 캡슐화 + 매직 메소드


private $age;
function __get($key){
return $this->$key;
}
function __set($key,$value){
$this->$key=$value;
}
로그인 후 복사

$ Object-& gt; age; //객체의 프라이빗 속성에 액세스하면 __get() 매직 메서드가 자동으로 호출되고 액세스된 속성 이름이
$Object->age=12; /객체의 개인 속성을 설정할 때 자동으로 __set() 매직 메서드를 호출하고 설정된 속성 이름과 속성 값을 __set() 메서드에 전달합니다.

참고: 매직 메서드에서는 다음을 사용할 수 있습니다. 결정하기 위한 분기 구조 서로 다른 $key는 서로 다른 작업을 수행합니다.

4. 마법의 캡슐화 방법에 대해:
①__set($key,$value): 호출 시 두 개의 매개변수를 메서드에 전달합니다. : 설정해야 하는 속성의 이름, 속성 값입니다.
②__get($key,$value): 클래스의 비공개 속성을 읽을 때 자동으로 호출됩니다. 호출 시 읽어야 하는 속성의 이름인 매개변수를 메소드에 전달합니다. ): 외부에서 isset()을 사용합니다. 함수가 개인 속성을 감지하면 자동으로 호출됩니다.
>>> 기본적으로 감지되지 않는 개인 속성을 감지하려면 클래스 외부에서 isset();을 사용하세요. false
>>>그래서 자동 호출 시 내부 감지 결과를 반환하는 __isset(); 함수를 사용할 수 있습니다.

 function __isset($key){
     return isset($this -> $key);
 }
로그인 후 복사


외부 isset($object name->private property); 을 탐지에 사용하면 위의 __isset()이 반환한 결과가 자동으로 호출됩니다!

4__unset($key): 비공개 속성을 삭제하기 위해 unset() 함수를 외부에서 사용할 때 자동으로 호출됩니다.

(

$this -> $key
); 3 } unset($object name->private attribute)을 사용하여 외부에서 속성을 삭제하면 속성 이름이 자동으로 전달됩니다. __unset( )을 사용하고 이 마법 메서드에 맡기세요.

继承的基础知识:

1、如何实现继承?
给子类使用extends关键字,让子类继承父类;
class Student extends Person{}

2、实现继承的注意事项?
①子类只能继承父类的非私有属性。
②子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用。
③PHP只能单继承,不支持一个类继承多个类。但是一个类进行多层继承。
class Person{}
class Adult extends Person{}
class Student extends Adult{}
//Student 类就同时具有了Adult类和Person类的属性和方法

3、方法覆盖(方法重写)
条件一: 子类继承父类
条件二:子类重写父类已有方法

符合上述两个条件,称为方法覆盖。覆盖之后,子类调用方法,将调用子类自己的方法。
同样,除了方法覆盖,子类也可以具有与父类同名的属性,进行属性覆盖。

如果,子类重写了父类方法,如何在子类中调用父类同名方法?

partent::方法名();
所以,当子类继承父类时,需在子类的构造中的第一步,首先调用父类构造进行复制。


 function __construct($name,$sex,$school){
     partent::__construct($name,$sex);
     $this -> school = $school;
 }
로그인 후 복사

三、PHP关键字

1、final
①final修饰类,此类为最终类,不能被继承!
②final修饰方法,此方法为最终方法,不能被重写!
③final不能修饰属性。

2、static
①可以修饰属性和方法,分别称为静态属性和静态方法,也叫类属性,类方法;
②静态属性,静态方法,只能使用类名直接调用。
使用"类名::$静态属性" , "类名::静态方法()"
Person::$sex; Person::say();
③静态属性和方法,在类装载时就会声明,先于对象产生。
④静态方法中,不能调用非静态属性或方法;
非静态方法,可以调用静态属性和方法。
(因为静态属性和方法在类装载时已经产生,而非静态的属性方法,此时还没有实例化诞生)
⑤在类中,可以使用self关键字,代指本类名。


 class Person{
     static $sex = "nan";
     function say(){
         echo self::$sex;
     }
 }
로그인 후 복사

⑥静态属性是共享的,也就是new出很多对象,也是共用一个属性。

3、const关键字:
在类中声明常量,不能是define()函数!必须使用const关键字。
与define()声明相似,const关键字声明常量不能带$,必须全部大写!
常量一旦声明,不能改变。调用时与static一样,使用类名调用Person::常量。

4、instanceof操作符:
检测一个对象,是否是某一个类的实例。(包括爹辈,爷爷辈,太爷爷辈……)


$zhangsan instanceof Person;
로그인 후 복사


【小总结】几种特殊操作符

. 只能连接字符串; "".""
=> 声明数组时,关联键与值["key"=>"value"]
-> 对象($this new出的对象)调用成员属性,成员方法;
:: ①使用parent关键字,调用父类中的同名方法:parent::say();
②使用类名(和self)调用类中的静态属性,静态方法,以及常量。


四、单例

싱글턴 패턴을 모노모픽 패턴이라고도 합니다. 클래스는 하나의 객체 인스턴스만 가질 수 있음이 보장됩니다.

구현 포인트:
① 생성자는 비공개이며 new 키워드를 사용하여 객체를 생성하는 것은 허용되지 않습니다.
② 객체를 얻기 위한 외부 메소드를 제공하고, 메소드에서 객체가 비어 있는지 확인합니다.
비어 있으면 객체를 생성하고 반환하고, 비어 있지 않으면 직접 반환합니다.
③인스턴스 객체의 속성과 객체를 획득하는 방법은 정적이어야 합니다.
4이후에는 우리가 제공하는 정적 메소드를 통해서만 객체를 생성할 수 있습니다.
eg:$s1 = Singleton::getSingle();

5.객체 직렬화 및 매직 메서드

***关键词:clone与__clone、__antoload()、串行化与反串行化(序列化与反序列化)、类型约束、魔术方法小总结(12个)

clone与__clone


1、当使用=讲一个对象,赋值给另一个对象时,赋的实际是对象的地址。
两个对象指向同一地址,所以一个对象改变,另一个也会变化。
eg: $lisi = $zhangsan;
2、如果想要将一个对象完全克隆出另一个对象,两个对象是独立的,互不干扰的,
则需要使用clone关键字;
eg: $lisi = clone $zhangsan; //两个对象互不干扰
3、__clone():
①当使用clone关键字,克隆对象时,自动调用clone函数。
②__clone()函数,类似于克隆时使用的构造函数,可以给新克隆对象赋初值。
③__clone()函数里面的$this指的是新克隆的对象
某些版本中,可以用$that代指被克隆对象,绝大多数版本不支持。
4、__toString()
当使用echo等输出语句,直接打印对象时调用echo $zhangsan;
那么,可以指定__toString()函数返回的字符串;


 function __toString(){
     return "haha";
 }
 echo $zhangsan; //结果为:haha
로그인 후 복사

5、__call()
调用类中未定义或未公开的方法时,会自动执行__call()方法。
自动执行时,会给__call()方法传递两个参数;
参数一:调用的方法名
参数二:(数组)调用方法的参数列表。

__antoload()


①这是唯一一个不在类中使用的魔术方法;
②当实例化一个不存在的类时,自动调用这个魔术方法;
③调用时,会自动给__autoload()传递一个参数:实例化的类名
所以可以使用这个方法实现自动加载文件的功能。


 function __autoload($className){
 include    "class/".strtolower($className).".class.php";
 }
 $zhangsan=new Person();//本文件内没有Person类,会自动执行__autoload()加载person.class.php文件
로그인 후 복사

Three객체 지향 직렬화 및 역직렬화(직렬화 및 역직렬화)


1. 직렬화: 일련의 연산을 통해 객체를 객체로 변환하는 문자열 처리 과정을 직렬화라고 합니다. hesponse 자체 상태를 설명하는 숫자 값을 기록함으로써 물체를 기록합니다 직렬화? ①객체를 네트워크를 통해 전송해야 하는 경우

② 객체를 파일이나 데이터베이스에 유지해야 하는 경우

4 직렬화 및 역직렬화 구현 방법Serialization: $ str=serialize($zhangsan) ;
Deserialization: $duixiang=unserialize($str);
5, __sleep() 매직 메서드:
①객체 직렬화를 실행하면 자동으로 __sleep() 함수가 실행됩니다.
②__sleep() 함수는 배열을 반환해야 합니다. 배열에 없는 속성은 직렬화할 수 없습니다.
function __sleep (){
return array("name"," age"); //이름/나이 두 가지 속성만 직렬화할 수 있습니다.
}
6.__wakeup() 매직 메소드
①객체를 deserialize할 때 __wakeup() 메소드가 자동으로 호출됩니다.
②자동으로 호출되면 생성된 새 객체를 deserialize하는 데 사용됩니다. 속성이 재할당됩니다. ... 네 가지
유형 제약



1. 유형 제약: 은 변수가 해당 데이터 유형만 저장할 수 있도록 제한하기 위해 변수에 데이터 유형을 추가하는 것을 의미합니다.
(이 작업은 강력한 유형의 언어에서 일반적입니다. PHP에서는 배열 및 객체에 대한 유형 제약 조건만 구현할 수 있습니다.)
2 유형 제약 조건이 특정 클래스인 경우 이 클래스와 해당 하위 클래스 클래스 객체를 전달할 수 있습니다. 3. PHP에서는 형식 제약 조건이 함수의 형식 매개 변수에서만 발생할 수 있습니다.

 class Person{}
     class Student extends Person{}
     function func(Person $p){ //约束函数的形参,只接受Person类及Person子类
     echo "1111";
     echo $p -> name;
 }
로그인 후 복사

func(new Person());
func(new Student());
func("111"); ×

形如new Person();的形式,我们称其为"匿名对象";

※※※基类:父类    
※※※派生类:子类

魔术方法小总结


1、__construct():构造函数,new一个对象时,自动调用。
2、__destruct():析构函数,当一个对象被销毁前,自动调用。
3、__get():访问类中私有属性时,自动调用。传递读取的属性名,返回$this->属性名
4、__set():给类的私有属性赋值时,自动调用。传递需要设置的属性名和属性值;
5、__isset():使用isset()检测对象私有属性时,自动调用。传递检测的属性名,返回isset($this -> 属性名);
6、__unset():使用unset()删除对象私有属性时,自动调用。传递删除的属性名,方法中执行unset($this -> 属性名);
7、__toString():使用echo打印对象时,自动调用。返回想要在打印对象时,显示的内容;返回必须是字符串;
8、__call():调用一个类中未定义或未公开的方法时,自动调用。传递被调用的函数名,和参数列表数组;
9、__clone():当使用clone关键字,克隆一个对象时,自动调用。作用是为新克隆的对象进行初始化赋值;
10、__sleep():对象序列化时,自动调用。返回一个数组,数组中的值就是可以序列化的属性;
11、__wakeup():对象反序列化时,自动调用。为反序列化新产生的对象,进行初始化赋值;
12、__autoload():需要在类外部声明函数。当实例化一个未声明的类时,自动调用。传递实例化的类名,可以使用类名自动加载对应的类文件。

 

六、抽象类和抽象方法

1. 추상 메소드란 무엇인가요?
메서드 본문 {}이 없는 메서드는 abstract 키워드로 수정되어야 합니다. 이러한 메소드를 추상 메소드라고 합니다.
추상 함수 say(); //추상 메서드

2.추상 클래스란 무엇인가요?
추상 키워드로 수정된 클래스는 추상 클래스입니다.
추상 클래스 사람{}

3. 추상 클래스에 대한 참고 사항:
① 추상 클래스는 비추상 메서드를 포함할 수 있습니다.
② 추상 메서드를 포함하는 클래스는 추상 클래스여야 하며 추상 클래스여야 합니다. 추상 메소드를 포함해야 합니다.
3 추상 클래스는 인스턴스화할 수 없습니다. (추상 클래스에는 추상 메소드가 포함될 수 있습니다. 추상 메소드에는 메소드 본문이 없으며 인스턴스화 호출은 의미가 없습니다.)
추상 클래스를 사용하는 목적은 인스턴스화를 제한하는 것입니다! ! !

4. 하위 클래스가 추상 클래스를 상속하는 경우 하위 클래스가 추상 클래스가 아닌 이상 하위 클래스는 상위 클래스의 모든 추상 메서드를 재정의해야 합니다.

5. 추상 클래스를 사용하는 역할은 무엇인가요?
① 인스턴스화를 제한합니다. (추상 클래스는 불완전한 클래스입니다. 내부의 추상 메소드에는 메소드 본문이 없으므로 인스턴스화할 수 없습니다.)
② 추상 클래스는 하위 클래스의 상속에 대한 사양을 제공합니다. 추상 클래스에 정의된 추상 메서드를 구현합니다.

7. 인터페이스와 다형성

Interface


1. 인터페이스란 무엇인가요?
인터페이스는 인터페이스를 구현하는 클래스에서 구현해야 하는 메서드 조합 집합을 제공하는 사양입니다.
인터페이스는 인터페이스 키워드를 사용하여 선언됩니다.
interface Inter{}

2, 인터페이스의 모든 메서드는 추상 메서드여야 합니다.
인터페이스의 추상 메서드는 필요하지 않으며 추상으로 수정할 수 없습니다.

3. 인터페이스에서는 변수를 선언할 수 없으며, 상수만 사용할 수 있습니다. ! !

4. 인터페이스는 확장 키워드를 사용하여 인터페이스를 상속할 수 있습니다!
인터페이스는 확장 상속 인터페이스를 사용하여 다중 상속을 달성합니다.
interface int1은 Inter,Inter2{}

5를 확장합니다. 클래스는 Implements 키워드를 사용하여 인터페이스를 구현할 수 있습니다!
클래스는 구현을 사용하여 인터페이스를 구현하고 동시에 여러 인터페이스를 구현할 수 있습니다. 여러 인터페이스는 쉼표로 구분됩니다.
추상 클래스 Person은 Inter,Inter2를 구현합니다.{}
클래스는 하나 이상의 인터페이스를 구현합니다. 그러면 이 클래스, 모든 인터페이스의 모든 추상 메소드를 구현해야 합니다!
이 수업은 추상 수업이 아닌 한.


[인터페이스 && 추상 클래스의 차이점] :

① 선언 방법은 인터페이스는 인터페이스 키워드를 사용하고 추상 클래스는 추상 클래스를 사용합니다.
②구현/상속 측면에서 클래스는 추상 클래스를 상속하기 위해 확장을 사용하고 인터페이스를 구현하기 위해 구현을 사용합니다.
3추상 클래스는 한 가지 방식으로만 상속될 수 있으며, 인터페이스는 여러 방식으로 구현될 수 있습니다. (인터페이스 확장 인터페이스), 다중 구현 (클래스 구현 인터페이스)
④추상 클래스는 비추상 메소드를 가질 수 있고, 인터페이스는 추상 메소드만 가질 수 있고 추상 메소드는 가질 수 없습니다. 추상 클래스의 추상 메서드는 abstract 키워드로 수정해야 하며, 인터페이스의 추상 메서드는 수정자로 수정할 수 없습니다.
⑤추상 클래스는 속성과 변수를 가질 수 있는 클래스입니다. 인터페이스는 상수만 가질 수 있습니다.

2 다형성

2. 다형성
1. 클래스는 여러 하위 클래스에 상속됩니다.
이 클래스의 특정 메서드가 여러 하위 클래스에서 서로 다른 기능을 표시하는 경우 이를 동작 다형성이라고 합니다.

2. 다형성을 달성하는 데 필요한 방법:
① 하위 클래스는 상위 클래스를 상속합니다.
② 하위 클래스는 상위 클래스 메서드를 재정의합니다.
3 상위 클래스 참조는 하위 클래스 객체를 가리킵니다.

위 내용은 PHP 객체지향에 대한 실무적 기본지식의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿