PHP의 객체 처리 부분의 핵심을 완전히 재개발하여 더 많은 기능을 제공하고 성능을 향상시켰습니다. 이전 버전의 PHP에서는 객체가 기본 유형(숫자, 문자열)과 동일한 방식으로 처리되었습니다. 이 방법의 단점은 객체를 변수에 할당하거나 매개변수를 통해 객체를 전달할 때 객체가 완전히 복사된다는 점입니다. 새 버전에서는 위 작업이 값 대신 참조(참조는 개체의 식별자로 이해될 수 있음)를 전달합니다.
많은 PHP 프로그래머는 객체를 처리하는 기존 방식을 인식하지 못할 수도 있습니다. 실제로 대부분의 PHP 애플리케이션은 정상적으로 실행됩니다. 또는 최소한의 변경만 필요합니다.
비공개 및 보호 멤버
PHP5에서는 비공개 및 보호 멤버 변수라는 개념을 도입했습니다. 이를 사용하여 클래스 멤버의 가시성을 정의할 수 있습니다.
예
Protected 멤버는 하위 클래스에서 액세스할 수 있는 반면, Private 멤버는 클래스 자체에서만 액세스할 수 있습니다.
class MyClass {
private $Hello = "Hello, World!n"
protected $Bar = "Hello, Foo!n"
protected $Foo = "Hello, Bar!n";
function printHello() {
print "MyClass::printHello() " . $this->Hello
print "MyClass::printHello() " . this->Bar;
print "MyClass::printHello() " . $this->Foo
}
}
class MyClass2는 MyClass {
protected $Foo; 🎜> function printHello() {
MyClass::printHello(); /* 인쇄해야 함 */
인쇄 "MyClass2::printHello()" /* Sh는 인쇄하지 않음 아무것도 출력하지 않음 */
print "MyClass2::printHello() " . $this->Bar /* 인쇄하면 안 됨(선언되지 않음)*/
print "MyClass2::printHello() " $ this ->Foo; /* 인쇄해야 함 */
}
}
$obj = new MyClass()
print $obj->Hello; * /
print $obj->Bar; /* 아무것도 인쇄하면 안 됩니다 */
print $obj->Foo /* 아무것도 인쇄하면 안 됩니다 */
$obj- > ;printHello(); /* 인쇄해야 함 */
$obj = new MyClass2()
print $obj->Hello /* 아무것도 인쇄하면 안 됨 */
$obj - >Bar; /* 아무것도 인쇄하지 않아야 함 */
print $obj->Foo /* 아무것도 인쇄하지 않아야 함 */
$obj->printHello(); > ?>
프라이빗 메서드와 보호 메서드
PHP5에는 프라이빗 메서드와 보호 메서드라는 개념도 도입되었습니다.
예:
class Foo {
private function aPrivateMethod() {
echo "Foo::aPrivateMethod() Called.n"
}
protected function aProtectedMethod() {
echo "Foo::aProtectedMethod() Called.n";
$this->aPrivateMethod()
}
}
class Bar는 Foo를 확장합니다.
public function aPublicMethod() {
echo "Bar::aPublicMethod() Called.n";
$this->aProtectedMethod()
}
}
$o = new Bar;
$o->aPublicMethod();
?>
이전에는 클래스를 사용하지 않았던 이전 코드, 액세스 수정자(public, protected, private)가 없는 코드는 변경 없이 사용할 수 있습니다. 달리다.
추상 클래스와 추상 메서드
Php5에서는 추상 클래스와 추상 메서드의 개념도 도입했습니다. 추상 메소드는 메소드의 시그니처만 선언하고 구현을 제공하지 않습니다. 추상 메소드를 포함하는 클래스는 abstract로 선언되어야 합니다.
예:
추상 클래스 AbstractClass {
추상 공용 함수 테스트()
}
클래스 ImplementedClass는 AbstractClass {
공용 함수 테스트() {
echo "ImplementedClass::test() Called.n";
}
}
$o = new ImplementedClass;
$o->test()?> ;
추상 클래스는 인스턴스화할 수 없습니다. 추상 클래스를 사용하지 않은 이전 코드는 변경되지 않고 실행될 수 있습니다.
인터페이스
Php5에서는 인터페이스를 도입했습니다. 클래스는 여러 인터페이스를 구현할 수 있습니다.
예:
인터페이스 Throwable {
public function getMessage()
}
class MyException 구현 Throwable {
public function getMessage() {
// ... <}>}
}
? & Gt;
이전 인터페이스를 사용하지 않은 이전 코드는 여전히 약한 형식이지만 함수 매개변수를 정의할 때 클래스의 유형 힌트를 사용하여
예
interface Foo {
function a(Foo $foo) <🎜에서 전달될 것으로 예상되는 객체 유형을 선언할 수 있습니다. >}
interface Bar {
function b(Bar $bar);
}
class FooBar 구현 Foo, Bar {
function a(Foo $foo) {
// . ..
}
function b(Bar $bar) {
// ...
}
}
$a = new FooBar
$b = new FooBar ; ;
$a->a($b);
$a->b($b)
?> 및 기타 강력한 유사 유형 언어, PHP5 클래스에 대한 힌트 입력 컴파일하는 동안이 아닌 런타임에 확인됩니다. 즉,
function foo(ClassName $object) {
// ...
}
?>
는 다음 코드와 같습니다.
function foo($object) {
if (!($object instanceof ClassName)) {
die("인수 1은 ClassName의 인스턴스여야 합니다."); > }
}
?>
이 구문은 내장 유형이 아닌 클래스에만 적용됩니다.
Final
PHP 5에서는 final 멤버와 final 메서드를 선언하는 final 키워드를 도입했습니다. Final 멤버와 Final 메서드는 서브클래스로 재정의될 수 없습니다.
예
class Foo {
최종 함수 bar() {
>게다가 최종 수업으로 선언할 수도 있습니다. 클래스 final을 선언하면 클래스가 상속되지 않습니다. 최종 클래스의 메서드는 기본적으로 최종 메서드이므로 다시 선언할 필요가 없습니다.
예제
final class Foo {
// 클래스 정의
}
// 다음 줄은 불가능합니다
// class Bork 확장 Foo {}
?>
속성은 final로 정의할 수 없습니다.
final을 사용하지 않는 이전 코드는 수정 없이 실행할 수 있습니다.
객체 복제
Php4는 사용자가 정의할 수 있는 메커니즘을 제공하지 않습니다. 객체의 복사 프로세스를 제어하는 복사 생성자. Php4는 바이너리 복사를 수행하므로 개체의 모든 속성을 매우 정확하게 복제합니다.
객체의 모든 속성을 정확하게 복사하는 것은 우리가 항상 원하는 것이 아닐 수도 있습니다. GTK Window 객체 a와 같은 복사 생성자가 필요하다는 것을 보여주는 예가 있습니다. a는 필요한 모든 리소스를 보유합니다. 이 GTK 창을 객체 b에 복사할 때 우리는 b가 새로운 리소스 객체를 보유하는 것을 선호합니다. 또 다른 예: 객체 a를 객체 c에 복사할 때 객체 a에는 객체 c가 포함됩니다. 우리는 객체 b가 객체 c에 대한 참조보다는 새로운 객체 c의 복사본을 포함하는 것을 선호할 수 있습니다. (번역자 주: 여기서 말하는 것은 얕은 복제와 깊은 복제입니다.)
객체의 복사는 clone 키워드를 통해 이루어집니다(Clone은 복제된 객체의 __clone() 메서드를 호출합니다). 객체의 __clone 메서드는 직접 호출할 수 없습니다.
$copy_of_object = clone $object;
?>
개발자가 객체의 복사본을 생성하면 php5는 __clone() 메서드가 존재하는지 확인합니다. 존재하지 않는 경우 기본 __clone() 메서드를 호출하여 객체의 모든 속성을 복사합니다. __clone() 메서드가 정의된 경우 _clone() 메서드는 새 개체의 속성을 설정합니다. 편의를 위해 엔진은 기본적으로 모든 속성을 복사합니다.따라서 __clone() 메서드에서는 변경해야 하는 속성만 덮어쓰면 됩니다. 다음과 같습니다:
예
class MyCloneable {
static $id = 0
function MyCloneable() {
$this->id = self:: $ id
}
function __clone() {
$this->address = "뉴욕"
$this->id = self::$id ;
}
$obj = new MyCloneable();
$obj->name = "안녕하세요";
$obj->address = "Tel-Aviv"
인쇄 obj ->id "n";
$obj_cloned = $obj를 인쇄합니다.
$obj_cloned->id를 인쇄합니다.
print $obj_cloned->address . "n";
?>
균일 생성자
Php5에서는 개발자가 클래스의 생성자를 선언할 수 있습니다. 생성자가 있는 클래스는 새 객체를 생성할 때마다 이 메서드를 호출하므로 생성자는 객체를 사용하기 전에 객체를 초기화하는 데 적합합니다
Php4에서는 생성자 이름이 클래스 이름과 동일합니다. . 하위 클래스 생성자에서 상위 클래스 생성자를 호출하는 것이 매우 일반적이고 상속 시스템에서 클래스를 재배치하여 상위 클래스에 대한 변경이 발생하면 클래스 생성자를 변경해야 하는 경우가 많다는 점을 고려하면 php4의 접근 방식은 분명히 그다지 적절하지 않습니다. . 합리적인.
Php5에서는 생성자 함수를 선언하는 표준 방법인 __construct()를 도입했습니다. 다음과 같습니다:
예
class BaseClass {
function __construct() {
print In BaseClass constructorn";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructorn";
}
}
$obj = new BaseClass();
$obj = new SubClass()
?> php5가 __construct()를 찾을 수 없는 경우 이전 버전과의 호환성을 유지하려면 , 클래스와 이름이 같은 구식 생성자 메서드를 찾습니다. 간단히 말해서, 이전 코드에 __construct() 메서드가 포함된 경우에만 호환성 문제가 있습니다.
파괴 메소드
객체 지향 프로그래밍에서 소멸자 메소드를 정의할 수 있다는 것은 매우 유용한 기능입니다. 소멸자 메서드는 디버깅 정보를 기록하고, 데이터베이스 연결을 닫고, 기타 정리 작업을 수행하는 데 사용할 수 있습니다. Php4에는 소멸자 메서드가 없습니다. 하지만 php4는 이미 요청이 끝날 때 호출될 함수를 등록하는 기능을 지원합니다.
Php5에 도입된 소멸자 메소드 개념은 다른 객체지향 언어(예: java)와 일치합니다. 이 객체에 대한 마지막 참조가 소멸되면 소멸자 메서드가 호출되고 호출이 완료된 후 메모리가 해제됩니다. 참고: 소멸자 메서드는 어떤 매개변수도 허용하지 않습니다.
예제
class MyDestructableClass {
function __construct() {
print "In constructorn"; $this->name = "MyDestructableClass"; > }
function __destruct() {
print "Destroying " . $this->name . "n"
}
}
$obj = new
?>
생성 메서드와 마찬가지로 상위 클래스의 소멸자 메서드도 암시적으로 호출되지 않습니다. 하위 클래스는 parent::__destruct()를 호출하여 자체 소멸자에서 이를 명시적으로 호출할 수 있습니다.
상수
Php5에서는 클래스 수준 상수를 도입했습니다.
class Foo {
const 상수 = "상수"
}
echo "Foo::constant = "
?>
const를 사용하지 않는 이전 코드는 여전히 정상적으로 실행됩니다.
예외
PHP4에는 예외 제어 기능이 없습니다. Php5는 다른 언어(java)와 유사한 예외 제어 모델을 도입합니다. php5는 모든 예외 포착을 지원하지만 finally 절은 지원하지 않습니다.
catch 문 블록에서는 예외가 다시 발생할 수 있습니다. 여러 개의 catch 문이 있을 수도 있습니다. 이 경우 발견된 예외는 일치하는 유형의 첫 번째 catch 문과 위에서 아래로 비교됩니다. 끝까지 검색한 후에도 일치하는 catch 절이 없으면 다음 try/catch 문을 찾습니다. catch할 수 없는 마지막 예외가 표시됩니다. 예외가 발견되면 프로그램은 catch 문 블록 아래에서 실행을 시작합니다.
예제
class MyException {
function __construct($Exception) {
$this->Exception = $Exception;
}
function Display( ) {
인쇄 "MyException: $this->Exceptionn"
}
}
class MyExceptionFoo extends MyException {
function __construct($Exception) {
$this-> ;예외 = $Exception;
}
function Display() {
print "MyException: $this->Exceptionn"
}
}
try {
throw new MyExceptionFoo('Hello')
}
catch(MyException $Exception) {
$Exception->Display()
}
catch(Exception $Exception) {
echo $Exception;
}
?>
위의 예는 Exception에서 상속받지 않는 예외 클래스를 정의할 수 있음을 보여줍니다. 그러나 Exception에서 상속하고 자체 예외를 정의하는 것이 좋습니다. . 이는 시스템에 내장된 Exception 클래스가 유용한 정보를 많이 수집할 수 있지만 이를 상속하지 않는 예외 클래스는 이 정보를 얻을 수 없기 때문입니다. 다음 PHP 코드는 시스템에 내장된 Exception 클래스를 모방합니다. 각 속성 뒤에는 주석이 옵니다. 각 속성에는 getter가 있습니다. 이러한 getter 메서드는 시스템 내부 처리에서 자주 호출되므로 이러한 메서드는 최종으로 표시됩니다.
예
클래스 예외 {
함수 __construct(string $message=NULL, int code=0) {
if (func_num_args()) {
$this ->메시지 = $메시지;
}
$this->code = $code;
$this->파일 = __FILE__; // throw 절
$this->line = __LINE__; // throw 절
$this->trace = debug_backtrace();
$this->string = StringFormat($this);
}
보호된 $message = '알 수 없는 예외'; // 예외 메시지
protected $code = 0; // 사용자 정의 예외 코드
protected $file; // 예외 소스 파일 이름
protected $line; // 예외 소스 라인
private $trace; // 예외 역추적
private $string; // 내부 전용!!
최종 함수 getMessage() {
$this->message를 반환합니다.
}
최종 함수 getCode() {
return $this->code;
}
최종 함수 getFile() {
return $this->file;
}
최종 함수 getTrace() {
return $this->trace;
}
최종 함수 getTraceAsString() {
return self::TraceFormat($this);
}
function _toString() {
return $this->string;
}
정적 비공개 함수 StringFormat(예외 $Exception) {
//... PHP 스크립트에서 사용할 수 없는 함수
// 모든 관련 정보를 문자열
로 반환하는 함수
}
정적 비공개 함수 TraceFormat(예외 $Exception) {
//... PHP 스크립트에서 사용할 수 없는 함수
// 역추적을 문자열로 반환하는 함수
}
}
?>
저는 예외를 인정하고 있습니다.
저희는 예외를 인정합니다.
반환된 개체는 역참조입니다. 함수에서
Php4中不能再次引用函数返回的对象以进一步呼叫返回对象的방법, 而php5是可以的 .
class Circle {
function draw() {
'원' 인쇄;
}
}
class Square {
function draw() {
print "Squaren";
}
}
function ShapeFactoryMethod($shape) {
스위치($shape) {
case "Circle":
return new Circle();
case "Square":
새 Square() 반환;
}
}
ShapeFactoryMethod("원")->draw();
ShapeFactoryMethod("사각형")->draw();
?> 静态成员变weight能够被初始化.
예
class foo {
static $my_static = 5
public $my_prop = 'bla'
print foo::$my_static ;
$obj = new foo;
print $obj->my_prop;
?>
정적 메서드
PHP 5에서는 Next 클래스를 인스턴스화하지 않고도 사용할 수 있습니다. 정적 메소드를 호출하십시오.
예
class Foo {
공개 정적 함수 aStaticMethod() {
()
?> 정적 방법.
instanceof
Php5에서는 객체가 클래스의 인스턴스인지, 파생 클래스의 인스턴스인지, 인터페이스를 구현하는지 테스트하는 데 사용할 수 있는 인스턴스of 키워드를 도입했습니다.
예
< ?php
class baseClass { }
$a = new baseClass;
if ($a instanceof baseClass) {
echo "Hello World";
?> >정적 함수 변수
정적 변수는 이제 컴파일 단계에서 처리됩니다. 따라서 프로그래머는 참조를 통해 정적 변수에 값을 할당할 수 있습니다. 이렇게 하면 성능이 향상될 수 있지만 정적 변수에 대한 간접 참조는 사용할 수 없습니다.
이제 참조로 전달된 함수 매개변수에도 기본값을 설정할 수 있습니다.
예
function my_function(&$var = null) {
if ($var === null) {
die("$var에는 값이 있어야 합니다. ");
}
}
?>
__autoload()
__autoload() 선언되지 않은 클래스가 초기화되면 차단 함수가 자동으로 호출됩니다. 클래스 이름은 자동으로 __autoload() 함수에 전달됩니다. 그리고 __autoload()에는 매개변수가 하나만 있습니다.
예
function __autoload($className) {
include_once $className . ".php"
}
$object = new ClassName; >
오버로드 가능한 메서드 호출 및 속성 액세스
메서드 호출 및 속성 액세스는 __call, __get() 및 __set() 메서드를 통해 오버로드될 수 있습니다.
예: __get() 및 __set()
class Setter {
public $n;
공용 $x = array("a" => 1, "b" => 2, "c" => 3);
함수 __get($nm) {
인쇄 "[$nm]n 가져오기";
if (isset($this->x[$nm])) {
$r = $this->x[$nm];
'반환: $rn' 인쇄;
$r 반환;
} else {
'Nothing!n' 인쇄;
}
}
function __set($nm, $val) {
print "[$nm]을 $valn으로 설정";
if (isset($this->x[$nm])) {
$this->x[$nm] = $val;
'OK!n' 인쇄;
} else {
'Not OK!n' 인쇄;
}
}
}
$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a ;
$foo->z ;
var_dump($foo);
?>
예: __call()
class Caller {
private $x = array(1, 2, 3);
함수 __call($m, $a) {
인쇄 "메소드 $m called:n";
var_dump($a);
return $this->x;
}
}
$foo = 새 발신자();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?> 공개 $x = 1;
공개 $y = 2;
}
$obj = 새로운 Foo;
foreach ($obj as $prp_name => $prop_value) {
// 속성 사용
}
?>
一个类的所有对象city能够被迭代浏览到, 如果这个类实现了一个 空的接口: 이동 가능. 换句话说,实现了Traversable은 traversable을 통해 类可以과 foreach一起使를 사용합니다.
接口 IteratorAggregate 및 Iterator는 代码中如何迭代.IteratorAggregate接口유일보법:getIterator() 必须返回一个数组
예
클래스 ObjectIterator는 Iterator를 구현합니다. {
private $obj;
비공개 $num;
함수 __construct($obj) {
$this->obj = $obj;
}
함수 rewind() {
$this->num = 0;
}
function valid() {
return $this->num < $this->obj->max;
}
기능 키() {
return $this->num;
}
function current() {
switch($this->num) {
case 0: return "첫 번째";
사례 1: '2nd'를 반환합니다.
사례 2: '3번째'를 반환합니다.
기본값: $this->num."th"를 반환합니다.
}
}
function next() {
$this->num ;
}
}
클래스 객체는 IteratorAggregate를 구현합니다. {
public $max = 3;
함수 getIterator() {
새 ObjectIterator($this)를 반환합니다.
}
}
$obj = 새 객체;
// 이 foreach ...
foreach($obj as $key => $val) {
echo "$key = $valn";
}
//는 다음 7줄을 for 지시어와 일치시킵니다.
$it = $obj->getIterator();
for($it->rewind(); $it->hasMore(); $it->next) {
$key = $it->current();
$val = $it->key();
echo "$key = $valn";
}
설정 해제($it);
?>
새로운 __toString 방법
은 toString 방법을 사용하여 제어할 수 있습니다.
예
class Foo {
함수 __toString() {
'무엇이든'을 반환합니다.
}
}
$obj = new Foo;
에코 $obj; // __toString()을 호출
?>
Reflection API
Php5引入了全套的反射API,以支持对类,接口,函数,방법에 따른 반향向工程。
它也提供了API以从程序中提取注释文档。反射API적详细资料参考此处:http://sitten-polizei.de/php/reflection_api/docs/언어.reflection.html
예
class Foo {
public $prop ;
함수 Func($name) {
echo "안녕하세요 $name";
}
}
reflection_class::export('Foo');
reflection_object::export(new Foo);
reflection_method::export('Foo', 'func');
reflection_property::export('Foo', 'prop');
reflection_extension::export('표준');
?>
새로운 관리 시스템
Php5는 완전히 새로운 관리 시스템을 갖추고 있으며, 더 많은 보안을 유지하기 위해 노력하고 있습니다.使사용 mutex锁정/解除锁정
以上就介绍了h5 PHP5의 새로운 특성: 更加면向对象化的PHP,包括了h5면적内容,希望对PHP教程有兴趣的朋友有所帮助.