2014-12-30 2 views
1

PHP를 사용하고 있습니다.생성자 내에서 생성 된 속성의 속성 유형을 설정하는 방법 - PHP

클래스의 핵심 내에서 정의 된 속성은 정적이어야하므로 동적 이름으로 속성을 만들 수 있도록 생성자에서 하나의 속성을 만들어야합니다.

final class User extends Z 
{ 

} 

Abstract Class Z 
{ 
    function __constructor() 
    { 
     $x = get_called_class() . 'Id'; 
     $this->$x = null; 
    } 
} 

우리 위해 var_dump()OBJ 사용자 우리가 유형을 보호 나는 재산 A를 설정하려면

object(User)#1 (1) { 
    ["UserId"]=> 
    NULL 
} 

했을 경우.

어떻게하면됩니까? 동적으로 명명 된 속성의 이름을 설정하는 더 좋은 방법이 있습니까?

+0

다음과 같이 표시됩니다. 'object (A) # 1 (0) {}'어떻게하면 obj를 만들 수 있습니까? – Rizier123

답변

0

아마 당신은 할 수있는 최선의 마법 게터/세터 메소드 및 속성의 배열을 사용할 수 있습니다 : 속성이 개인 것을

<?php 

abstract class Z 
{ 
    private $properties = array(); 

    function __construct() 
    { 
     $x = get_called_class(); 
     $this->$x = null; 
    } 

    public function __set($prop, $val) 
    { 
     $this->properties[$prop] = $val; 
    } 

    public function __get($prop) 
    { 
     return $this->properties[$prop]; 
    } 
} 

class A extends Z 
{ 

} 

var_dump(new A()); 

참고, 아이 클래스는 __get__set 방법을 통해 이동해야합니다.

동적 속성을 호출 된 클래스 이름으로 제한 할 수도 있습니다.

<?php 

abstract class Z 
{ 
    private $classprop; 

    function __construct() 
    { 
     $x = get_called_class(); 
     $this->$x = true; 
    } 

    public function __set($prop, $val) 
    { 
     if ($prop !== get_called_class()) { 
      throw new \UnexpectedValueException('Cannot Set Dynamic properties Other than Class Name'); 
     } 

     $this->classprop = $val; 
    } 

    public function __get($prop) 
    { 
     if ($prop !== get_called_class()) { 
      throw new \UnexpectedValueException('Cannot Get Dynamic properties Other than Class Name'); 
     } 

     return $this->classprop; 
    } 
} 

class A extends Z 
{ 

} 

왜 이런 동적 속성이 필요한지 신중하게 생각해보십시오.

+0

하나의 속성에 대해서만 필요하며 더 좋은 방법을 생각할 수 없습니다. – BadToTheBone

+0

오른쪽이지만'__get'과'__set'는 하나의 속성에만 사용할 수 없습니다. 그러므로 배열'$ properties'. – chrisguitarguy

0

가장 쉬운 대답은 없을 것입니다. protected $Id;과 같은 일반적인 기본 속성을 사용하고 문제를 해결하십시오. 당신이 정말로 클래스 확장에서 "동적"속성을 가지고해야하는 경우

는 아마 가장 간단한는 확장 클래스의 속성을 선언하는 것입니다 :

final class User extends Z { 

    protected $UserId; 

} 

그런 다음 Z의 코드는이 보호 특성을 선택할 것입니다. 속성 이름은 코더에 의해 결정되고 스크립트는 생성자가 실행될 때 스크립트를 "발견"하지만 클래스 이름과 같이 컴파일 타임에 고정 된 것으로 인해 속성 이름이 이미 결정된 경우 psudo-dynamic입니다. 기능적으로 차이는 없습니다.

진정한 동적 속성 생성을 위해서는 스크립트 내에서 클래스, 메서드, 속성 및 함수를 프로그래밍 방식으로 변경할 수있는 확장 기능 인 runkit을 추가해야합니다. 좋은 사람은 this one by Demitry Zenovich 인 것 같습니다. 당신이 그것으로 작업하는 시간을 정당화하기 위해 수행 할 수있는 진정으로 복잡한 기능을 가지고 있지 않다면, 그것은 당신의 삶을 더 쉽게 만들지 않을 것입니다.

관련 문제