> 백엔드 개발 > PHP 튜토리얼 > PHP 객체지향 프로그래밍 - 특별 연습 DAY 4

PHP 객체지향 프로그래밍 - 특별 연습 DAY 4

WBOY
풀어 주다: 2016-07-29 09:15:05
원래의
873명이 탐색했습니다.
객체 에 대한 특수 사례
(PHP에서만 사용 가능, 다른 언어에는 객체 가 없음)
객체 의 경우 - 매직 메소드
__construct(), __destruct() 생성자 및 소멸자
__tostring()
__invoke()
__call(), __callStatic()
__get(), __set(), __isset() , __unset( )
__clone()
__tostring()
객체를 String으로 사용하면 이 메서드가 자동으로 호출됩니다.
Echo $obj;
__invoke()
객체를 메서드로 호출하면 이 메서드가 자동으로 호출됩니다.

$obj(4);

<?php

class MagicTest{

	//__tostring会在把<strong>对象</strong>转换为string的时候自动调用
	public function __tostring(){
		return "This is the Class MagicTest. ";
	}

	// __invoke会在把<strong>对象</strong>当作一个方法调用的时候自动调用
	public function __invoke($x){
		echo "__invoke called with parameter ".$x."\n";
	}
}

$obj = new MagicTest();
echo $obj."\n";
$obj(5);

?>
로그인 후 복사

출력:
이것은 매개변수 5로 호출되는 Class MagicTest
__invoke입니다.

__call()
객체 가 존재하지 않는 메소드 이름에 액세스하면 __call() 메소드가 자동으로 호출됩니다.
__callStatic()
객체 가 존재하지 않는 정적 메서드 이름을 지정하면 __callStatic() 메서드가 자동으로 호출됩니다. 이 두 메서드는 PHP에서 메서드 오버로딩이라고도 합니다.
덮어쓰기를 구분하는 데 주의하세요.
이 두 메서드를 통해 동일한 메소드 이름이 다른 메소드에 대응하여 구현될 수 있습니다.

<?php

class MagicTest{

	public function __tostring(){
		return "This is the Class MagicTest. ";
	}

	public function __invoke($x){
		echo "__invoke called with parameter ".$x."\n";
	}

	//方法的重载
	//这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组
	public function __call($name,$arguments){
		echo "Calling " . $name . " with parameters: ".
			implode(",", $arguments)."\n";

	}

	//<strong>静态方法</strong>的重载,注意这个方法需要设定为static
	public static function __callStatic($name,$arguments){
		echo "Static Calling " . $name . " with parameters: ".
			implode(",", $arguments)."\n";

	}
}

$obj = new MagicTest();

//runTest这两个方法的名称本来不能完全相同,但是通过魔术方法,可以调用了
$obj->runTest("para1","para2"); //没有声明这个runTest方法,因为有__call这个魔术方法,也可以被调用
MagicTest::runTest("para1","para2"); //没有声明这个runTest方法,因为有__callStatic这个魔术方法,也可以被调用

?>
로그인 후 복사

출력:

매개변수로 runTest 호출: para1, para2
정적 매개변수로 runTest 호출: para1, para2

__get(), __set(), __isset(), __unset()
액세스할 수 없는 속성에 값을 할당할 때 __set()가 호출됩니다.
액세스할 수 없는 속성의 값을 읽으면 __get()이 호출됩니다.
액세스할 수 없는 속성에 대해 isset() 또는 empty()가 호출되면 __isset()가 호출됩니다.
액세스할 수 없는 속성이 호출될 때 unset( )가 호출되면 __unset()이 호출됩니다
소위 접근 불가능 속성은 실제로 특정 속성을 호출할 때 해당 속성이 정의되지 않은 것으로 발견됨을 의미합니다. 이때 다른 작업은 다른 매직 메서드를 트리거합니다. 🎜> 이러한 메서드는 속성 오버로딩의 매직 메서드라고도 합니다.



출력:

<?php

class MagicTest{

	public function __tostring(){
		return "This is the Class MagicTest. ";
	}

	public function __invoke($x){
		echo "__invoke called with parameter ".$x."\n";
	}

	//方法的重载
	//这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组
	public function __call($name,$arguments){
		echo "Calling " . $name . "with parameters: ".
			implode(",", $arguments)."\n";

	}

	//<strong>静态方法</strong>的重载,注意这个方法需要设定为static
	public static function __callStatic($name,$arguments){
		echo "Static Calling " . $name . "with parameters: ".
			implode(",", $arguments)."\n";

	}

	//属性重载
	public function __get($name){
		return "Getting the property ".$name."\n";
	}

	public function __set($name, $value){
		echo "Setting the property ".$name." to value " . $value."\n";
	}

	public function __isset($name){
		echo "__isset invoked\n";
		return true;
	}

	public function __unset($name){
		echo "unsetting property ".$name."\n";
	}
}

$obj = new MagicTest();
echo $obj->className."\n"; //className未定义,但是通过魔术方法__get,这个方法好像被定义了一样
$obj->className='MagicClassX'; //通过魔术方法__get将className名称定义为MagicClassX
echo '$obj->name is set?'.isset($obj->className)."\n";
echo '$obj->name is empty?'.empty($obj->className)."\n";
unset($obj->className);
?>
로그인 후 복사
className 속성 가져오기
className 속성을 MagicClassX 값으로 설정
__isset 호출됨
$obj->name이 설정되었나요?1 //return이 true이면 결과가 1로 표시되고 return이 false이면 결과가 비어 있는 것으로 표시됩니다.
__isset 호출됨
$obj->name이 비어 있습니까? //return이 true이면 결과는 비어 있고, return이 false이면 결과는 1입니다.
속성 className


지향적입니다. 🎜 >객체--마법 메서드

__clone()PHP for</strong>객체<br>프로그래밍 - 특별 연습 DAY 4
PHP面向<strong></strong></p>출력: <p>James<pre name=name='TBD'; //屏蔽你不想要他复制过去的数据,屏蔽掉他的数据,设置他的初始值 } } $james = new NbaPlayer(); $james->name = 'James'; echo $james->name."\n"; $james2 = clone $james; echo "Before set up: James2's: ".$james2->name."\n"; $james2->name='James2'; echo "James's: ".$james->name; echo "James's: ".$james2->name; ?>설정 전: James2의: TBD
James의: James
James의: James2 //James2의 데이터는 James의 데이터에 영향을 미치지 않습니다
-------------------------------- -- ------------------------------------------------PHP
객체
이것으로 프로그래밍 노트가 완성됩니다------------------------- -- ------------------------------------------------ --
위 내용은 PHP 객체지향 프로그래밍에 대한 소개 - 특별연습 DAY 4 관련 내용을 포함하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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