2012-11-19 2 views
0

두 클래스가 있습니다. 주소와 학생이 있습니다. 거리, 도시 및 주 속성을 검색하고 학생 인스턴스를 사용하여 할당 할 수 있도록 __call() 함수를 코딩해야합니다.

내가 한 출력 (I은 __call()를 코딩하지만 지금까지 단 출력의 마지막 줄 작동) :

John Smith 
50 
, , 
The address has been updated: 
50 second street, Palo Alto, CA 

출력의 세 번째 행은 다음과 같습니다

100 main street, Sunnyvale, CA 

그리고 그 곳에서 스택을 얻었습니다.

여기 내 코드입니다. 나는 어떤 도움을 주셔서 감사합니다.

<?php 
class Address { 
private $street; 
private $city; 
private $state; 

function __construct($s, $c, $st) { 
    $this->street = $s; 
    $this->city = $c; 
    $this->state = $st; 
} 
function setCity($c) { 
    $this->city = $c; 
} 
function getCity() { 
    return $this->city; 
} 
function setState($s) { 
    $this->state = $s; 
} 
function getState() { 
    return $this->state; 
} 
function setStreet($s) { 
    $this->street = $s; 
} 
function getStreet() { 
    return $this->street; 
} 
} 
class Student { 
private $name; 
private $age; 
private $address; 

function __construct($n, $a, Address $address) { 
    $this->name = $n; 
    $this->age = $a; 
    $this->address = $address; 
} 

function getName() { 
    return ucwords($this->name); 
} 

function getAge() { 
    return $this->age; 
} 

function setName($n) { 
    $this->name = $n; 
} 

function setAge($a) { 
    $this->age = $a; 
} 

function __set($name, $value) { 
    $set = "set".ucfirst($name); 
    $this->$set($value); 
} 

function __get($name) { 
    $get = "get".ucfirst($name); 
    return $this->$get(); 
} 

function __call($method, $arguments) { 
    // Need more code 

    $mode = substr($method,0,3); 
    $var = strtolower(substr($method,3)); 
    if ($mode =='get'){ 
     if (isset($this -> $var)){ 
      return $this ->$var; 
     } 
    } elseif ($mode == 'set') { 
     $this ->$var = $arguments[0]; 
     } 
    } 

} 
$s = new Student('john smith', 50, '100 main street', 'Sunnyvale', 'CA'); 
echo $s->name; 
echo "\n"; 
echo $s->age; 
echo "\n"; 
echo $s->address->street . ", " . $s->address->city . ", " . $s->address->state; 
echo "\n"; 
$s->street = "50 second street"; 
$s->city = "Palo Alto"; 
$s->state = "CA"; 
echo "The address has been updated:\n"; 
echo $s->street . ", " . $s->city . ", " . $s->state; 


//print_r($s); 

?> 
+0

가치가 있습니다. Student에 get/setAddress()를 추가 한 다음 getter/setter를 호출하거나 프록시 메소드를 Student에 추가하십시오. – Gordon

답변

0

street, citystatepublic, 또는 게터를 사용해야합니다. 다음에 대한

$s = new Student('john smith', 50, '100 main street', 'Sunnyvale', 'CA'); 

:

다음 변경

$s = new Student('john smith', 50, new Address('100 main street', 'Sunnyvale', 'CA')); 

그리고 다음 변경 : 다음에 대한

echo $s->address->street . ", " . $s->address->city . ", " . $s->address->state; 

:

echo $s->address->getStreet() . ", " . $s->address->getCity() . ", " . $s->address->getState(); 
,536을

Student 생성자에 Address 객체가 필요하며 "street", "city"및 "state"속성이 "private"이고 "getters"를 사용해야합니다.

;-)

+0

정말 고마워요! 그것은 작동하지만 일반 코드를 변경하는 대신 function __call()에서 뭔가를 변경해야하는 방법이 있습니까? 미안 해요. PHP로 익숙해 져서 배울려고합니다. – Oksana

+0

예, 다른 방법은 "공개"에 대한 "개인"변경입니다. 다음 변경 : {private $ name; 개인 $ 연령; 개인 $ 주소; } 다음으로 : {public $ name; public $ age; public $ address; } –