>  기사  >  백엔드 개발  >  PHP의 객체지향에 대한 나의 이해에 대해 이야기해 주세요.

PHP의 객체지향에 대한 나의 이해에 대해 이야기해 주세요.

零下一度
零下一度원래의
2017-07-17 11:29:075466검색

오늘은 PHP의 객체지향적 성격에 대해 소개하겠습니다. 객체지향이라고 하면 프로세스지향을 언급해야겠습니다. 처음 배울 때 객체지향과 프로세스지향을 구분하지 못하는 경우가 많았기 때문입니다.

객체지향 프로그래밍(OOP)은 우리 언어의 기본 기술입니다. 프로그래밍. PHP5는 OOP를 잘 지원합니다. OOP 아이디어를 사용하여 PHP의 고급 프로그래밍을 수행하는 방법은 PHP 프로그래밍 기능을 향상하고 좋은 웹 개발 아키텍처를 계획하는 데 매우 의미가 있습니다. 아래에서는 프로그래밍에 PHP의 OOP를 사용하는 실제적인 의미와 적용 방법을 설명하기 위해 예제를 사용합니다.

일반적으로 데이터베이스 백엔드로 웹사이트를 구축할 때 우리는 프로그램이 다양한 애플리케이션 환경에 적합해야 한다는 점을 고려할 것입니다. 다른 프로그래밍 언어와 다른 점은 PHP에서는 일련의 특정 기능(ODBC 인터페이스를 사용하지 않는 경우)에 의해 데이터베이스가 작동된다는 점입니다. 이는 매우 효율적이지만 캡슐화로는 충분하지 않습니다. 통합된 데이터베이스 인터페이스가 있다면 프로그램을 수정하지 않고도 이를 다양한 데이터베이스에 적용할 수 있어 프로그램의 이식성과 크로스 플랫폼 기능이 크게 향상됩니다.

차이점을 소개하겠습니다.

객체 지향은 어떤 객체가 문제를 처리하는지에 중점을 둡니다.

가장 큰 특징은 속성과 함수를 가지는 클래스로 구성되어 있고, 클래스로부터 객체를 얻어서 문제를 해결한다는 점입니다.

프로세스 지향은 문제 해결 과정에 중점을 둡니다. 가장 큰 특징은 이 문제를 하나씩 해결하기 위해 일련의 프로세스를 사용한다는 것입니다.

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

1 private function formatName(){} //这个方法仅仅能在类内部使用$this调用2 function showName(){3 $this -> formatName();4 }

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

1 private $age;2 //set方法3 function setAge($age){4 $this->age=$age;5 }6 //get方法7 function getAge(){8 return $this->age;9 }

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

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

    __get(  ->   __set(, ->= }

$Object-> ;age; /객체의 프라이빗 속성에 액세스하면 __get() 매직 메서드가 자동으로 호출되고 액세스된 속성 이름이
$Object->age=12; object 비공개 속성이 사용되면 __set() 매직 메서드가 자동으로 호출되고 설정된 속성 이름과 속성 값이

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

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

1 function __isset($key){2 return isset($this -> $key);3 }

当外部使用isset($对象名->私有属性);检测时,将自动调用上述__isset()返回的结果!

④__unset($key):外部使用unset()函数删除私有属性时,自动调用;
 1 function __unset($key){ 2 unset($this -> $key); 3 } 
当外部使用unset($对象名->私有属性);删除属性时,自动将属性名传给__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::方法名();
所以,当子类继承父类时,需在子类的构造中的第一步,首先调用父类构造进行复制。

1 function __construct($name,$sex,$school){2 partent::__construct($name,$sex);3 $this -> school = $school;4 }

 

三、PHP关键字

 

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

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

1 class Person{2 static $sex = "nan";3 function say(){4 echo self::$sex;5 }6 }

⑥静态属性是共享的,也就是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()函数返回的字符串;

1 function __toString(){2 return "haha";3 }4 echo $zhangsan; //结果为:haha

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

 

__antoload()


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

1 function __autoload($className){2 include    "class/".strtolower($className).".class.php";3 }4 $zhangsan=new Person();//本文件内没有Person类,会自动执行__autoload()加载person.class.php文件

 

面向对象串行化与反串行化(序列化与反序列化)


1、串行化:将对象通过一系列操作,转化为一个字符串的过程,称为串行化。

     (对象通过写出描述自己状态的数值来记录自己)

2、反串行化:将串行化后的字符串,再转为对象的过程,称为反串行化;
3、什么时候使用串行化?
①对象需要在网络中传输的时候
② 对象需要在文件或数据库中持久保存的时候
4、怎样实现串行化与反串行化
串行化:  $str=serialize($zhangsan);
反串行化:$duixiang=unserialize($str);
5、__sleep()魔术方法:
①当执行对象串行化的时候,会自动执行__sleep()函数;
②__sleep()函数要求返回一个数组,数组中的值,就是可以串行化的属性;不在数组中的属性,不能被串行化;
function __sleep(){
return array("name","age"); //只有name/age两个属性可以串行化。
}

6、__wakeup()魔术方法
①当反串行化对象时,自动调用__wakeup()方法;
②自动调用时,用于给反串行化产生的新对象属性,进行重新赋值。
 1 function __wakeup(){ 2 $this -> name = "李四"; 3 } 

类型约束


1、类型约束:是指在变量时,加上数据类型,用于约束此变量只能存放对应的数据类型。
(这种操作常见于强类型语言,在PHP中,只能实现数组和对象的类型约束)
2、如果类型约束为某一个类,则本类以及本类的子类对象,都可以通过。
3、在PHP中,类型约束,只能发生在函数的形参中。

1 class Person{}2 class Student extends Person{}3 function func(Person $p){ //约束函数的形参,只接受Person类及Person子类4 echo "1111";5 echo $p -> name;6 }

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

양식, 우리는 이것을 "익명 객체"라고 부릅니다.

1.__construct(): 생성자, 객체가 새로 생성되면 자동으로 호출됩니다.
2.__destruct(): 객체가 파괴될 때 자동으로 호출되는 소멸자입니다.

3.__get(): 클래스의 개인 속성에 액세스할 때 자동으로 호출됩니다. 읽기 속성 이름을 전달하고 $this->속성 이름을 반환합니다

4. __set(): 클래스의 비공개 속성에 값을 할당할 때 자동으로 호출됩니다. 설정해야 하는 속성 이름과 속성 값을 전달합니다. 5. __isset(): 객체의 비공개 속성을 감지하기 위해 isset()을 사용할 때 자동으로 호출됩니다. 감지된 속성 이름을 전달하고 isset($this -> 속성 이름)을 반환합니다. 6. __unset(): 객체의 비공개 속성을 삭제하기 위해 unset()을 사용할 때 자동으로 호출됩니다. 삭제된 속성 이름을 전달하고


7 메소드에서 unset($this -> 속성 이름)을 실행합니다. __toString(): 객체를 인쇄하기 위해 echo를 사용할 때 자동으로 호출됩니다. 객체를 인쇄할 때 표시하려는 콘텐츠를 반환합니다. 반환은 문자열이어야 합니다.
8. __call(): 클래스에서 정의되지 않거나 공개되지 않은 메서드를 호출할 때 자동으로 호출됩니다. 호출된 함수 이름과 매개변수 목록 배열을 전달합니다.
9. __clone(): clone 키워드를 사용하여 객체를 복제할 때 자동으로 호출됩니다. 이 함수는 새로 복제된 객체에 값을 초기화하고 할당하는 것입니다. __sleep(): 객체가 직렬화될 때 자동으로 호출됩니다. 배열을 반환하며, 배열의 값은 직렬화될 수 있는 속성입니다. __wakeup(): 객체가 역직렬화될 때 자동으로 호출됩니다. 새로 생성된 객체를 역직렬화하려면 초기화 및 할당을 수행합니다.
12. __autoload(): 함수는 클래스 외부에서 선언되어야 합니다. 선언되지 않은 클래스가 인스턴스화되면 자동으로 호출됩니다. 인스턴스화된 클래스 이름을 전달하면 해당 클래스 파일이 클래스 이름을 사용하여 자동으로 로드될 수 있습니다.


6. 추상 클래스 및 추상 메서드


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 키워드로 수정해야 하며, 인터페이스의 추상 메서드는 수정자로 수정할 수 없습니다.
⑤추상 클래스는 속성과 변수를 가질 수 있는 클래스입니다. 인터페이스는 상수만 가질 수 있습니다.

다형성

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

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

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

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