2012-04-28 2 views
1

나는이 클래스를 Wordpress 환경의 테마로 만들었습니다.PHP 클래스 내에서 메소드/함수가 작동하는 방법

function get_image() 
{ 
    return 'working'; 
} 

을하지만 실행할 때이

echo $theme->get_image(); 

그것은 작동하지 않기 때문에 지금은 의아해입니다 .... 그러나 :

class Theme { 
    function __construct() 
    { 
     add_action('after_setup_theme', array(&$this, 'do_this')); 
    } 

    function do_this() 
    { 
     require_once('helper_functions.php'); 
    } 
} 
$theme = new Theme(); 

그리고

는 helper_functions.php 내에서 내가 가진 직접 전화하면 다음과 같이 작동합니다.

echo get_image(); 

하지만 클래스 메서드를 사용하고 있으므로 클래스 메서드를 사용하려면 클래스 개체를 사용해야합니다 ... 왜 직접 호출 할 수 있습니까?

답변

0

함수 get_image()은 클래스 Theme에 설정된 함수가 아니며 클래스에 포함 된 별도의 파일로 설정됩니다.

클래스의 함수로 사용하려면 클래스 파일에 코드를 작성하고 코드를 클래스로 옮겨야합니다.

대체 당신은 클래스의 사용

class Helper_functions { 

    public function get_image() { 
     return "working!"; 
    } 
} 

을 확장하고 당신이 그것을했다 때문에

class Theme extends Helper_functions { 

    function __construct() 
    { 
     add_action('after_setup_theme', array(&$this, 'get_image')); 
    } 

} 

$theme = new Theme(); 

대체
에 테마 클래스 파일을 변경할 수있는 몇 가지 파일의 여러 가지 기능을 수행 할 수 있습니다 Theme 클래스 파일이나 확장 클래스 파일에서이 작업을 수행하십시오.

class Theme { 

    ... 

    function get_image() { include('theme_file_get_image.php'); } 
    function another_function { include('theme_file_another_function.php'); } 
} 
+0

내가이 방법을 사용하는 이유는 메서드로 포함 할 함수가 많고 클래스를 모두 유지하는 것이 아니라 별도의 파일로 구성하려고하기 때문입니다. 달성하고자하는 것에 대한 해결책이 있습니까? 감사. –

+0

함수가 클래스의 일부가되도록 정말로 필요한 경우에는 클래스에 정의해야합니다. 만약 당신이 절대적으로 여러 파일을 관리하고 싶다면 내가 제공 한 대안 답을 확인해 보라. :) – fhugas

+0

고마워. 그게 정확히 내가 한 일이라고 생각해. 그냥 include 대신에 require_once를 사용 했어. 차이가있다. ? –

0

분명히 잘못된 방식으로 이해하고 계실 것입니다. 이 경우 get_image()은 방법이 아닙니다. 스크립트 실행 중에 호출 할 수있는 또 다른 일반 함수입니다.

메소드로 만들려면 클래스 선언 내에 선언해야합니다.

class Theme 
{ 
    function __construct() 
    { 
     add_action('after_setup_theme', array(&$this, 'do_this')); 
    } 

    function do_this() 
    { 
     require_once('helper_functions.php'); 
    } 

    function get_image() 
    { 
     return 'working'; 
    } 
} 

개체 및 클래스에 대한 자세한 내용은 here을 참조하십시오.

+0

-ok 아마도 도움이 될 것입니다. 내가이 방법을 사용하는 이유는 메서드로 포함 할 함수가 많고 모든 클래스를 메서드로 선언하지 않고 별도의 파일로 구성하여이를 유지 관리하기가 어려웠 기 때문입니다. 달성하고자하는 것에 대한 해결책이 있습니까? 감사. –

0

당신이보고있는 것의 결과 최대 this question 금액에 대한 답변 : 정의 함수와

"포함 된 파일 내의 코드는 함수와 동일한 범위에서 실행된다 (그리고 클래스가 글로벌이면서), 거기에 삽입되지 않고 거기에있는 것을 대체합니다. "

따라서 포함 된 파일의 기능은 전역 범위에서 정의되므로 get_image()에 대한 호출이 작동합니다.

이 동등해야한다 : get_image()가 글로벌 점수에 있음을

//Include the helper functions 
require_once('helper_functions.php'); 

class Theme 
{ 
    function __construct() 
    { 
     add_action('after_setup_theme', array(&$this, 'do_this')); 
    } 

    function do_this() 
    { 
     get_image(); 
    } 
} 

$test = new Theme(); 
echo $test->do_this(); //'working'; 

주와 테마 클래스의 하지 멤버 함수.

0

include 및 require는 종종 파일 내용을 부모 스크립트에 "복사/붙여 넣기하는 것과 비슷합니다."라고 말하면서 예상 한 것처럼 보입니다. 그러나 실제로는 정확하지 않습니다. 그래서 당신이하는 일이 효과가없는 것입니다.

일부 언어에는 코드를 해석하기 전에 텍스트를 바꾸는 컴파일러 매크로가 있으므로 wpork가됩니다. PHP는하지만, 모든 include 문은 런타임에 평가됩니다. 귀하의 경우, 클래스는 require 문이 실행되기 전에 완전히 정의됩니다. 결과적으로 전역 함수를 정의하는 코드를 실행하는 것입니다.

0

클래스 정의를 분리 할 수 ​​없습니다. 그것 모두는 한 번에 가야합니다. 수업이 너무 크면 어쩌면 너무 많은 책임이 있습니다. 공장 로직에서

  • 별도의 비즈니스 로직 (공장 논리가 새로운 객체를 instansiates 논리이며, 비즈니스 로직 그 객체).
  • 기능별로 분류하십시오.
  • 상속 및 다형성을 사용하십시오. 당신이 함수의 내부 파일을 포함하면

, 그것은 해당 기능의 범위에 존재한다. 당신이 한 일은 다음과 같은 의미입니다 :

public function do_this() { 
    function get_image() { ... } 
} 

정말 아무 것도하지 않습니다.

관련 문제