2011-10-07 2 views
3

나는 OOP에 매우 익숙하며 PHP에서는 매우 녹슬다. 이것이 클래스에서 함수를 호출하는 유효한 메소드인지 궁금합니다.클래스의 PHP 호출 함수 - 더 간단한 방법이 있습니까?

class newclass { 
    public function testfunc { 
     return '1'; 
    } 
} 

나는 다음과 같이 호출 할 수 :

echo testfunc->newclass(); 

또는 같은

: 그것은 다음과 같은 예에서 정의

echo newclass()::testfunc; 

난 항상 볼 수 있으며 추가 코드처럼 보였다?

$this = new newclass(); 
$this->testfunc(); 
echo $this; 

도움이 필요하시면 grea 내가이 OOP 일로 머리를 감싸기 시작했을 때 감사합니다. 내가 점심을 먹으려 고한다면 어쩌면 누군가가 수업/OOP에서 진정한 초보자를위한 훌륭한 가이드로 연결되는 링크를 제안 할 수 있습니다. 감사!

+5

http://php.net/manual/en/language.oop5.php – NullUserException

답변

1

당신은 정적 testfunc을 등처럼 호출 할 수 있습니다

class newclass{ 

    public static function testfunc{ 

    return '1'; 
    } 
} 

echo newclass::testfunc(); 

echo testfunc->newclass(); 어디에도없고

$class = new newclass(); 
echo $class->testfunc(); 

처럼 그 일을하는 방법이있을 때 그것을 할 수있는 적절한 방법입니다 정적 메소드가 아닌 인스턴스 메소드. 참고, 정적 메서드 내에서 $this을 참조 할 수있는 기능이 없습니다.

2

new은 클래스를 인스턴스화하기위한 키워드입니다. 클래스의 인스턴스없이 메서드를 사용하려면 정적 메서드 여야합니다. 정적 메소드를 가지려면 메소드를 정적으로 선언하십시오.

class foo 
{ 
    public static function bar() 
    { 
     return 'hello!'; 
    } 
} 

사용 방법은?

echo foo::bar(); //Will print hello 
+1

어딘가에 '함수'가 누락 된 것 같습니다. – sberry

+0

감사합니다. 도움이되었습니다. 만약 내가 데이터베이스에 연결하는 함수를 가지고 데이터베이스 클래스를 만들었다면. 나는 그것을 정적 방법으로 만들 것인가? – DieselPower

-2

당신은 당신은 생성자에 대한 정적 래퍼를 생성 할 수 있습니다

<?php 
//print.php 
function printHello(){ 
echo "Hello world"; 
} 
?> 

는 다음을 포함 함수를 호출하여 함수가 포함 된 PHP 파일 ...

<?php 
include "print.php"; 
printHello(); 

?> 
+0

그 질문에 대한 답은 절대로 없습니다. – markus

+0

ok my bad ....... –

0

를 포함 할 수 있습니다 같은 라인에서 메소드 호출을 연결할 수 있습니다.

<?php 

class ClassA { 

    static function create() { return new self(); } 

    function method1() { ... } 

} 


ClassA::create()->method1(); 
4

두 가지 방법 모두 작동하며 사용 사례가 있습니다.

첫 번째 사례는 클래스 인스턴스를 사용하는 일반적인 함수 호출이고 두 번째 사례는 정적 함수 호출입니다.

정적은주의 깊게 사용해야하며 매우 자주 리팩토링/재 설계가 필요하다는 신호입니다.

객체 지향 프로그래밍의 요점은 클래스 (청사진)를 작성하여 세계를 모델링 한 다음 필요에 따라 new라는 단어로 해당 클래스의 독립 인스턴스를 가능한 많이 생성하는 것입니다.각 인스턴스는 클래스의 DNA가있는 작은 유기체이며 다른 인스턴스에 영향을주지 않으면 서 모든 단일 인스턴스에서 동일한 클래스 메서드를 호출 할 수 있습니다.

정적 호출은 클래스의 인스턴스와 관련이 없으므로 사용중인 개체가 없습니다. 이것은 일부 도구 기능에 대한 세계적인 요구이며 사실 캡슐화에 대한 아이디어를 깨뜨린 것입니다.

정적 클래스 및 메서드에 대한 유스 케이스가 없지만주의해서 사용해야한다고 말하는 것은 아닙니다.

+0

"정적은주의를 기울여 사용되어야하며 사용은 종종 리팩토링/재 설계가 필요하다는 신호입니다."나는이 라인을 좋아한다. – dpp

+0

깊이있는 설명 주셔서 감사합니다. 정적 메서드가 db 클래스의 데이터베이스 연결 함수에 좋을지 궁금해하는 또 다른 질문에 게시했습니다. 당신의 생각/이유는 무엇입니까? – DieselPower

+0

IMO를 이해하지 못합니다. 둘 이상의 핸들을 작성하여 레지스트리에 인스턴스를 저장할 수 있기를 원할 것입니다. – markus

관련 문제