2011-08-18 5 views
0

두 번째로 My() 함수를 호출하면이 오류가 발생합니다. 어떤 제안을 크게 감상 할 수치명적인 오류 : 정의되지 않은 메서드를 호출하십시오. stdClass :: My()

class User { 
    function My($field) { 
     global $user; 
     global $db; 
     global $sessions; 

     if ($sessions == 2) { 
      $user = $db->Row("SELECT * FROM users WHERE username='".$_SESSION['username']."'"); 
      return $user->$field; 
     } 
    } 
} 

$user = new User; 

class Index { 
    function Startup() { 
     global $user; 

     $user_id = $user->My("user_id"); 
     $name = $user->My("firstname")." ".$user->My("surname"); 
    } 
} 

: 모든 것을 (나는 USER_ID을 요구하고있어) 처음 .. 아래로 벗겨진 코드가 잘 될 것 같다.

+2

중지하십시오. 이런 식으로 계속 쓰지 마라. 유감스럽게 생각하지만, PHP로 수업을하는 방법 (또는 실제로 모든 OO 언어)이 아닙니다. 귀하의 질문을 편집하여 성취하고자하는 바가 무엇인지 알려주십시오. 더 나은 해결책을 찾을 수있을 것이라고 확신합니다. – Mchl

+0

감사합니다. Mchl, 나는 일반 OOP 방식을 따르고 있지 않다는 것을 알고 있으며, 현재 전역에 대한 더 나은 대안을 사용하기위한 기사를 읽고 있습니다. 그러나 왜 내가 그 일을 그렇게 나쁘게 생각하는지 알지 못합니다. – dandoen

+0

방금 ​​첫 경험을했습니다. '$ user'는 전역 객체이기 때문에 코드에서'$ user'로 사용할 수 없습니다. '$ db'와'$ sessions'와 유사합니다. 대신 이러한 변수를 생성자에 인수로 전달하고 'User' 클래스의 인스턴스 변수로 저장하면이 위험을 피할 수 있습니다. 그것은 단지 한 가지입니다. '캡슐화''관심사 분리''다형성'' – Mchl

답변

1

죄송합니다. 첫 번째 대답이 잘못되었습니다.

My()와 Startup() 모두에서 $ user global을 정의했기 때문에 두 컨텍스트의 동일한 데이터를 사용하고 있습니다.

$ 사용자가 코드의 어딘가에있는 사용자 개체로 초기화되었으므로 모든 것이 정상입니다. 그러나 My() 함수 내의 $ db-> Row() 메서드는 전역 $ 사용자를 My() 연산이없는 stdClass로 변경합니다.

해결책 : My()에서 $ user 이전에 global이라는 단어를 제거하십시오.

+0

Tim, 감사합니다. 나는 그것을하여 해결 : $ user_id = User :: My ("user_id"); $ name = User :: My ("firstname"). ""사용자 : 내 ("성"); – dandoen

+0

다음 번에 첫 번째 답변을 수정하십시오. – Mchl

0

은 먼저 당신이 무엇을하고 있는지 알지 못한다면 글로벌 사용하지 않을하시기 바랍니다

$user = new User(); 
$user->my(); 

같은 변수를 initalize해야합니다.

관련 문제