>  기사  >  백엔드 개발  >  PHP의 클래스 생성자 매개변수 문제에 대한 솔루션

PHP의 클래스 생성자 매개변수 문제에 대한 솔루션

黄舟
黄舟원래의
2017-07-02 09:55:092077검색

상세 코드는 다음과 같습니다.

<?php
final class Registry {
    private $data = array();
    public function get($key) {
        return $this->data[$key];
    }
    public function set($key, $value) {
        $this->data[$key] = $value;
    }
}
abstract class Controller {
    protected $registry;   
    public function construct($registry) {
        $this->registry = $registry;
    }
}
class ControllerCommonHome extends Controller {
    public function test() {
        $this->registry->set(&#39;load&#39;,&#39;load&#39;);
    }
}
$registry = new Registry();
$con = new ControllerCommonHome($registry);
$con->test();
echo $registry->get(&#39;load&#39;);
?>

$con 객체 초기화 시 $registry 매개변수는 어떻게 전달되나요? 패스 값또는 주소? 값으로 전달되면 $con 개체가 test() 함수를 실행할 때 원래 개체 $registry에 영향을 주지 않아야 하지만 실제로는 레지스트리 값에 영향을 미칩니다.
그러나 $registry를 $registry = 123과 같은 간단한 변수로 변경하고 $con 객체의 $registry에 값을 할당하면 이번에는 여전히 123인 원래 변수에 영향을 미치지 않습니다.
Solve

좋아, clone() constructor. 객체를 복제할 수 있는 이유는 이전 상태를 변경하고 싶지 않기 때문입니다. 객체는 일반 변수가 아닙니다.
다른
과는 달리 Google에서 찾은 다음 단락을 참조하세요. Zval에 저장되는 변수(PHP4에서는 일반 변수와 마찬가지로 객체가 Zval에 저장됩니다.) Zval에는 내용(값)이 아닌 객체의 포인터만 저장됩니다. 객체를 복사하거나 객체를 매개변수로 함수에 전달할 때 데이터를 복사할 필요가 없습니다. 동일한 객체 포인터를 유지하고 다른 zval이 이 특정 객체가 현재 가리키는 객체 저장소에 알리도록 하세요. 객체 자체가 객체 저장소에 있기 때문에 객체에 대한 모든 변경 사항은 객체에 대한 포인터를 보유하는 모든 zval 구조에 영향을 미칩니다. 대상 객체에 대한 모든 변경 사항은 소스 객체에 영향을 미치므로 프로그램에 나타납니다. .이것은 PHP 개체가 항상 참조로 전달되는 것처럼 보이게 하므로 PHP의 개체는 기본적으로 "참조"로 전달되며 더 이상 PHP4에서처럼 선언하기 위해 &를 ​​사용할 필요가 없습니다.

이런 문제에 대해 생각해 본 적이 없습니다. 질문을 보고 정보를 찾아보았습니다

위 내용은 PHP의 클래스 생성자 매개변수 문제에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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