C#과 마찬가지로, class로 내가 원하는 자료의 형태를 만들어 지정하고 사용하는 것이 가능한데, 어디서나 사용 가능하게 하려면 별도의 파일로 저장해 놓고 현재 프로그램하는 파일에서 불러서 사용해야 한다. 이 부르는 동작이 바로 include문인데, 이것 가지고 하루를 끙끙댔다.
classes.php
<?php
class YahooQAResult
{
public $rank;
public $subject;
public $content;
public $chosenanswer;
function YAResult_rank() {
echo $this->rank;
}
function YAResult_subject() {
echo $this->subject;
}
function YAResult_content() {
echo $this->content;
}
function YAResult_chosenanswer() {
echo $this->chosenanswer;
}
}
?>
위와 같이 지정한 class를 다른 php 파일에 include하는데 " Cannot redeclare class..."라는 에러가 계속해서 뜨는 거다. 이리저리 궁리를 해 봤는데 해결을 하지 못하고 구글링을 통해 Stack Overflow에서 답을 얻었다. include 대신에 include_once를 사용하라는 것이다.
include_once "./classes.php";
동일한 디렉토리 내에 있는 경우 위와 같은 코드가 되는데, 이건 정말 몰랐다. 메뉴얼상에는 "include는 그냥 포함하는 거고, include_once는 비슷한데 특정 코드가 인클루드되었다면 그 코드는 다시는 인클루드될 수 없다는 차이점"이라고 기술되어 있다. 개념적으로 반대로 생각하게 기술되어 있는데, 그렇다면 include 문은 암묵적으로 다수 사용이 가능하도록 코드를 해석한다는 말이 되는데... 아직도 원리를 이해하려면 머나먼 길인 것 같다.
2011. 4. 7 추가 #######
클래스 내부의 변수를 추출하기 위해서 function을 정의했던 것인데, 이걸 하지 않아도 클래스명->변수명으로 값의 추출이 가능하다. 즉 아래와 같이 그냥 변수를 정의만 하면 된다.
classes.php
<?php
class YahooQAResult
{
public $rank;
public $subject;
public $content;
public $chosenanswer;
}
?>
이제 다른 곳에서 이 클래스를 사용하고 싶으면 정의하고 값을 빼 내면 된다. 단, -> 다음에 변수명을 쓸 때는 $를 빼는 것을 잊지 말자.
$new_result = new YahooQAResult;
$new_result->rank = 1;
$new_result->subject = "I am a boy.";...
echo $new_result->subject;
// I am a boy. 가 출력될 것이다.
2011. 4. 12 추가 #######
하나의 PHP 파일에 여러 개의 PHP 파일이 include될 경우에도 같은 문제가 일어난다.
예를 들어 아래와 같은 구조를 보자.
main.php
<?php
include a.php;
include b.php;
?>
a.php
<?php
include classes.php;
...
?>
b.php
<?php
include classes.php;
// 에러 발생
...
?>
a.php와 b.php 파일은 c.php라는 파일을 include하고 있으며, 이때 제대로 처리되지 않는다. 해결은 a.php와 b.php 파일 내의 c.php파일을 include_once를 이용해서 처리하는 것이다.
main.php
<?php
include a.php;
include b.php;
?>
a.php
<?php
include_once classes.php;
...
?>
b.php
<?php
include_once classes.php;
...
?>
No comments:
Post a Comment