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('Hello'); //直接输出对象 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개 ) )이 존재하지 않습니다!
이것은 테스트입니다.