초보자를 위한 PHP 객체지향 입문
객체 지향이란
객체는 정보와 정보 처리 방법에 대한 설명으로 구성된 전체입니다. 이는 현실 세계를 추상화한 것입니다.
객체 지향 프로그래밍입니다. , OOP라고도 합니다
실제 사회에서 우리가 마주하는 것은 컴퓨터, 컵, 집 등의 사물입니다.
물체의 3대 특징
1. 개체 동작: 개체에 적용할 수 있는 작업, 즉 조명을 켜고 끄는 작업은 동작입니다.
2. 물체의 모양: 해당 방법을 적용했을 때 물체가 반응하는 방식, 색상, 크기, 모양.
3. 객체의 표현: 객체의 표현은 신분증과 동일하며, 특히 동일한 행위와 상태의 차이를 구별합니다.
객체지향 콘텐츠
1.클래스: 사물의 추상적인 특성을 정의합니다. 클래스의 정의에는 데이터의 형태와 데이터에 대한 연산이 포함됩니다
2.객체: 클래스의 인스턴스입니다
3.멤버 변수: 클래스 내부에 정의된 변수입니다. 이 변수의 값은 외부에는 보이지 않지만 멤버 함수를 통해 접근할 수 있습니다. 클래스가 객체로 인스턴스화되면 변수를 객체의 속성이라고 부를 수 있습니다
4. 멤버 함수: 클래스 내부에 정의되어 객체의 데이터에 액세스하는 데 사용할 수 있습니다
5.상속: 상속은 하위 클래스가 자동으로 데이터 구조를 공유하는 메커니즘입니다. 과 상위 클래스의 메소드 사이의 관계입니다. 클래스를 정의하고 구현할 때 기존 클래스를 기반으로 할 수도 있고, 기존 클래스에서 정의한 콘텐츠를 자신의 콘텐츠로 활용하고, 새로운 콘텐츠를 추가할 수도 있습니다
6 .상위 클래스: 클래스는 다른 클래스에 의해 상속됩니다. 이 클래스는 상위 클래스, 기본 클래스 또는 슈퍼 클래스
7. 하위 클래스 라고 부를 수 있습니다. 다른 클래스를 상속하는 클래스를 하위 클래스라고 하며, 파생 클래스라고도 부를 수 있습니다
8. 다형성: 다형성은 동일한 연산이나 함수를 의미하며, 프로시저는 여러 유형에서 작동할 수 있습니다. 개체를 선택하고 다른 결과를 얻습니다. 동일한 메시지를 받은 후에도 서로 다른 객체가 다른 결과를 생성할 수 있는 현상을 다형성
9.오버로딩: 쉽게 말하면 함수나 메서드의 이름은 같지만 매개변수는 동일하다는 의미입니다. 목록이 다르기 때문에 이름은 같고 매개변수가 다른 함수나 메서드를 오버로드된 함수나 메서드라고 합니다
10.추상성: 추상화란 일관된 데이터 구조(속성)로 개체를 추상화하는 것을 말합니다. ) 및 동작(작업)을 클래스로 분류합니다. 클래스는 관련 없는 다른 콘텐츠를 무시하면서 애플리케이션과 관련된 중요한 속성을 반영하는 추상화입니다. 클래스의 구분은 주관적이지만 특정 애플리케이션과 관련이 있어야 합니다
11.캡슐화: 캡슐화는 현실 세계에 존재하는 객체의 속성과 동작을 하나로 묶는 것을 의미합니다. 논리 단위
12.생성자에 배치되며, 객체 생성 시 객체를 초기화하는 데 주로 사용됩니다. 즉, 객체 멤버 변수에 초기 값을 할당합니다. 객체를 생성하는 명령문에서
과 함께 사용되는 새로운 연산13.소멸자 : 소멸자(destructor) 생성자와는 달리 객체의 생명주기가 끝나면(예를 들어 객체가 위치한 함수가 호출된 경우) 시스템이 자동으로 실행하는 소멸자. 소멸자는 종종 "정리" 작업을 수행하는 데 사용됩니다(예를 들어 객체를 생성할 때 new를 사용하여 메모리 공간을 엽니다. 메모리 공간은 종료하기 전에 소멸자에서 삭제와 함께 해제되어야 합니다)
클래스 정의:
1. 클래스는 클래스 키워드 뒤에 클래스 이름을 사용하여 정의됩니다.
2. 클래스 이름 뒤 중괄호({}) 안에 변수와 메서드를 정의할 수 있습니다.
3. 클래스 변수는 var를 사용하여 선언하며, 변수 초기화도 가능합니다.
4. 함수 정의는 PHP 함수의 정의와 유사하지만, 함수는 클래스와 인스턴스화된 객체를 통해서만 액세스할 수 있습니다.
<?php class Site { /* 成员变量 */ var $url; var $title; /* 成员函数 */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title; } } //注:变量 $this 代表自身的对象。 ?>
객체 생성 in php
클래스가 생성된 후 new 연산자를 사용하여 이 클래스의 개체를 인스턴스화할 수 있습니다.
$php = new Site;
$taobao = new Site;
$google = new Site;
위 코드에서 세 개의 개체를 만들었으며 세 개체는 각각 독립적입니다
<?php header("Content-type: text/html; charset=utf-8");//设置编码 class Site { /* 成员变量 */ var $url; var $title; /* 成员函数 */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url . "</br>"; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . "</br>"; } } $php = new Site; $taobao = new Site; $google = new Site; // 调用成员函数,设置标题和URL $php->setTitle( "php中文网" ); $taobao->setTitle( "淘宝" ); $google->setTitle( "Google 搜索" ); $php->setUrl( 'm.sbmmt.com' ); $taobao->setUrl( 'www.taobao.com' ); $google->setUrl( 'www.google.com' ); // 调用成员函数,获取标题和URL $php->getTitle(); $taobao->getTitle(); $google->getTitle(); $php->getUrl(); $taobao->getUrl(); $google->getUrl(); ?>
생성자
생성자는 특별한 방법입니다. 주로 객체를 생성할 때 객체를 초기화하는 데 사용됩니다. 즉, 객체 멤버 변수에 초기값을 할당하는 데 사용됩니다. 항상 new 연산자와 함께 사용됩니다.
PHP 5에서는 개발자가 클래스에서 메서드를 생성자로 정의할 수 있습니다. 구문 형식은 다음과 같습니다.
void __construct ([ Mixed $args [, $... ]] )
분석 생성자
소멸자(destructor) 생성자와 반대로 객체의 수명 주기가 종료되는 경우(예: 객체가 호출되면 시스템이 자동으로 소멸자를 실행합니다.
PHP 5에서는 다른 객체지향 언어와 유사한 소멸자 개념을 도입했습니다. void __destruct. ( void )
<?php header("Content-type: text/html; charset=utf-8");//设置编码 class MyDestructableClass { function __construct() { print "构造函数</br>"; $this->name = "MyDestructableClass"; } function __destruct() { print "销毁 " . $this->name; } } $obj = new MyDestructableClass(); ?>
상속
PHP는 클래스를 상속하기 위해 확장 키워드를 사용합니다. 형식은 다음과 같습니다.
클래스 하위 확장 상위 {
}
<?php // 子类扩展站点类别 class Child_Site extends Site { var $category; function setCate($par){ $this->category = $par; } function getCate(){ echo $this->category; } } ?>
상위 클래스에서 상속된 메서드가 클래스의 요구 사항을 충족할 수 없는 경우 하위 클래스인 경우 다시 작성할 수 있습니다. 이 프로세스를 메서드 재정의라고 합니다. getUrl 및 getTitle 메소드가 인스턴스에서 다시 작성되었습니다.
<?php function getUrl() { echo $this->url . PHP_EOL; return $this->url; } function getTitle(){ echo $this->title . PHP_EOL; return $this->title; } ?>
액세스 제어
공개(Public): Public 클래스 멤버는 어디서든지 접근이 가능합니다.
protected (보호됨): 보호된 클래스 멤버는 자체적으로, 해당 하위 클래스와 상위 클래스에서 액세스할 수 있습니다. private (private): Private 클래스 멤버는 자신이 정의된 클래스에서만 액세스할 수 있습니다. 속성 액세스 제어 클래스 속성은 공개, 보호, 비공개 중 하나로 정의되어야 합니다. var로 정의하면 공개로 간주됩니다 메서드의 액세스 제어 클래스의 메소드는 공개 또는 비공개로 정의될 수 있습니다. 보호됩니다. 이러한 키워드가 설정되지 않은 경우 메소드 기본값은 public Constant 클래스에 배치할 수 있습니다. 항상 동일하게 유지되는 값을 상수라고 정의합니다. 상수를 정의하고 사용할 때 $ 기호를 사용할 필요가 없습니다. 상수의 값은 고정된 값이어야 하며 변수, 클래스 속성, 수학 연산의 결과 또는 함수 호출이 될 수 없습니다. PHP 5.3.0부터 변수를 사용하여 클래스를 동적으로 호출할 수 있습니다. 그러나 이 변수의 값은 키워드(예: self, parent 또는 static)일 수 없습니다. 추상 클래스 어떤 클래스든 가능합니다. inside 적어도 하나의 메소드가 abstract로 선언된 경우 해당 클래스는 abstract로 선언되어야 합니다. 추상으로 정의된 클래스는 인스턴스화할 수 없습니다. 추상으로 정의된 메서드는 호출 메서드(매개변수)만 선언하고 특정 함수 구현을 정의할 수는 없습니다. 추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 하며, 이러한 메서드의 액세스 제어는 상위 클래스와 동일하거나 더 완화되어야 합니다. 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public으로 선언되어야 하며 private으로 정의할 수 없습니다. 또한 메서드를 호출하는 메서드가 일치해야 합니다. 즉, 필수 매개변수의 유형과 개수가 일관되어야 합니다. 예를 들어 하위 클래스가 선택적 매개 변수를 정의하지만 상위 클래스의 추상 메서드 선언에 포함되지 않은 경우 두 선언 사이에 충돌이 없습니다. 인터페이스 인터페이스를 사용하면 클래스가 구현해야 하는 메서드를 지정할 수 있지만 이러한 메서드의 구체적인 내용을 정의할 필요는 없습니다. 인터페이스는 표준 클래스 정의와 마찬가지로 인터페이스 키워드를 통해 정의되지만, 그 안에 정의된 메소드는 모두 비어 있습니다. 인터페이스에 정의된 모든 메소드는 공개되어야 합니다. 이는 인터페이스의 특징입니다. 인터페이스를 구현하려면 Implements 연산자를 사용하세요. 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 합니다. 그렇지 않으면 치명적인 오류가 보고됩니다. 클래스는 여러 인터페이스를 구현할 수 있습니다. 쉼표를 사용하여 여러 인터페이스의 이름을 구분하세요. <?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
//echo $obj->protected; // 这行会产生一个致命错误
//echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 可以对 public 和 protected 进行重定义,但 private 而不能
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
//echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
//echo $obj2->private; // 未定义 private
//echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined
?>
<?php
/**
* Define MyClass
*/
class MyClass
{
// 声明一个公有的构造函数
public function __construct() { }
// 声明一个公有的方法
public function MyPublic() { }
// 声明一个受保护的方法
protected function MyProtected() { }
// 声明一个私有的方法
private function MyPrivate() { }
// 此方法为公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
//$myclass->MyProtected(); // 这行会产生一个致命错误
//$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有,受保护,私有都可以执行
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 此方法为公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
// $this->MyPrivate(); // 这行会产生一个致命错误
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>