>  기사  >  백엔드 개발  >  PHP 객체 지향 안내서 __toString() 사용법 복제 객체 __call 호출 오류 처리

PHP 객체 지향 안내서 __toString() 사용법 복제 객체 __call 호출 오류 처리

高洛峰
高洛峰원래의
2017-01-06 10:23:071330검색

16.__toString() 메소드
(PHP에서 제공하는) 클래스에서 "-"로 시작하는 메소드 이름을 선언하는 메소드는 특정 시간에 다른 상황에서 자동으로 실행된다는 것을 앞서 언급했습니다.
실행 메서드를 호출할 때 "__toString()" 메서드도 자동으로 호출됩니다.
가 개체 참조를 직접 출력할 때 자동으로 호출됩니다. 앞서 개체 참조가 포인터라고 말했습니다. 예: "$p =new "
Person()", $p는 참조입니다. echo를 사용하여 $p를 직접 출력할 수 없습니다. 이렇게 하면 "Catchable fatal
error: Person 클래스의 개체를 변환할 수 없습니다. to string". 클래스에
"__toString()" 메서드를 정의하면 객체 참조를 직접 출력할 때 오류가 발생하지 않습니다. 대신
"__toString()" 메서드가 자동으로 호출되어 "__toString()이 출력됩니다. )" 메서드이므로 "__toString()" 메서드에는
반환 값(return 문)이 있어야 합니다.
코드 스니펫

<?php 
// Declare a simple class 
class TestClass{ 
public $foo; 
public function __construct($foo) { 
$this->foo = $foo; 
} 
//定义一个__toString方法,返加一个成员属性$foo 
public function __toString() { 
return $this->foo; 
} 
} 
$class = new TestClass(&#39;Hello&#39;); 
//直接输出对象 
echo $class; 
?>

위 예제의 출력: Hello
17. 객체 복제
경우에 따라 프로젝트에서 두 개 이상의 동일한 객체를 사용해야 합니다. "new"
키워드는 객체를 다시 생성한 다음 동일한 속성을 할당하기 때문에 더 번거롭고 오류가 발생하기 쉬우므로 객체를 기반으로 동일한 객체를 완전히 복제하는
것이 매우 유용합니다. 복제 후에는 두 개체
가 서로 간섭하지 않습니다.
PHP5에서는 객체를 복제하기 위해 "clone" 키워드를 사용합니다.
코드 조각

<? 
class Person{ 
//下面是人的成员属性 
var $name; //人的名子 
var $sex; //人的性别 
var $age; //人的年龄 
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 
function __construct($name="", $sex="", $age=""){ 
$this->name=$name; 
$this->sex=$sex; 
$this->age=$age; 
} 
//这个人可以说话的方法, 说出自己的属性 
function say() { 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; 
} 
} 
$p1=new Person("张三", "男", 20); 
//使用“clone”克隆新对象p2,和p1对象具有相同的属性和方法。 
$p2=clone $p1; 
$p2->say(); 
?>

PHP5는 객체 복제 A에 사용되는 특수 메소드 이름 "__clone()" 메소드를 정의합니다.
"__clone()" 메소드를 사용하면 원본 객체와 동일한 속성과 메소드를 가진 객체가 생성될 때 자동으로 호출되는 메소드
복제 후 원본 객체의 내용을 변경하려면 __clone()을 사용해야 합니다. 매개 변수 없이 "__clone()" 메서드의 원래 속성과 메서드를 다시 작성하세요.
두 개의 포인터, $this와 $that이 자동으로 포함되며 $this는 복사본을 가리키고 $that는 원본;
코드 조각

class Person{ 
//下面是人的成员属性 
var $name; //人的名子 
var $sex; //人的性别 
var $age; //人的年龄 
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 
function __construct($name="", $sex="", $age=""){ 
$this->name=$name; 
$this->sex=$sex; 
$this->age=$age; 
} 
//这个人可以说话的方法, 说出自己的属性 
function say() { 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; 
} 
//对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本 
的属性和方法 
function __clone(){ 
//$this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。 
$this->name="我是假的$that->name"; 
$this->age=30; 
} 
} 
$p1=new Person("张三", "男", 20); 
$p2=clone $p1; 
$p1->say(); 
$p2->say(); 
?>

위 예의 출력:
실행 결과
내 이름: Zhang San 성별: 남자 내 나이: 20
내 이름 이다: 나는 가짜 장산이다 성별: 남자 내 나이: 30
18.__call 은 호출 오류를 처리합니다
프로그램 개발에서 객체를 사용하여 객체의 내부 메소드를 호출할 때 호출된 메소드가 존재하지 않는 경우 , 그러면 프로그램
프로그램이 잘못되어 프로그램이 종료되고 더 이상 실행할 수 없습니다. 그래서 프로그램이 객체 내부에 존재하지 않는 메소드
를 호출하면 호출된 메소드와 사용된 매개변수가 존재하지 않는다는 메시지가 표시되지만, 이때 프로그램은 계속 실행될 수 있습니다. 호출에 존재하지 않는 메소드를 사용하십시오. 해당 메소드가 사용되면 "__call()" 메소드가 자동으로 호출됩니다.
코드 조각

<?php 
//这是一个测试的类,里面没有属性和方法 
class Test{ 
} 
//产生一个Test类的对象 
$test=new Test(); 
//调用对象里不存在的方法 
$test->demo("one", "two", "three"); 
//程序不会执行到这里 
echo "this is a test<br>"; 
?>
위 예제에서 다음 오류가 발생하여 프로그램을 계속 실행할 수 없습니다.

치명적인 오류: 정의되지 않은 메서드 Test::demo() 호출
아래에 "__call()" 메소드를 추가했는데, 이 메소드에는 2개의 매개변수가 있습니다.
이 과정에서 __call() 메소드가 자동으로 호출되면 해당 메소드의 이름이 나타납니다. 존재하지 않는 메소드가 전달됩니다. 첫 번째 매개변수와 두 번째 매개변수
가 이 메소드의 여러 매개변수에 배열 형태로 전달됩니다.
코드 조각

<?php 
//这是一个测试的类,里面没有属性和方法 
class Test{ 
//调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数 
function __call($function_name, $args){ 
print "你所调用的函数:$function_name(参数:"; 
print_r($args); 
print ")不存在!<br>\n"; 
} 
} 
//产生一个Test类的对象 
$test=new Test(); 
//调用对象里不存在的方法 
$test->demo("one", "two", "three"); 
//程序不会退出可以执行到这里 
echo "this is a test<br>"; 
?>
위 예제의 출력 결과는 다음과 같습니다.

실행 결과
호출한 함수: 데모(매개변수: Array ( [0] => one [ 1] => 2개 [2] => 3개 ) )이 존재하지 않습니다!
이것은 테스트입니다.

더 많은 PHP 객체지향 가이드 __toString() 사용법, 객체 복제, __call 처리 호출 오류 및 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

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