sourcetip

PHP에서 동적 정적 메서드 호출?

fileupload 2023. 11. 4. 13:16
반응형

PHP에서 동적 정적 메서드 호출?

PHP 경험이 있는 분이 아래 사항을 도와주실 수 있을까요?내 코드 어딘가에, 나는 비인스턴트 클래스 내의 공개 정적 메서드에 대한 호출이 있습니다.

$result = myClassName::myFunctionName();

하지만 그런 수업을 많이 해서 사용자의 언어에 맞게 정확한 수업명을 정했으면 좋겠습니다.즉, 다음과 같은 것이 있습니다.

$language = 'EN';

... 그리고 나는 다음과 같은 일을 해야 합니다.

$result = myClassName_EN::myFunctionName();

언어를 함수의 매개 변수로 전달하여 하나의 공통 클래스 안에서 다룰 수 있다는 것을 알고 있지만 여러 가지 이유로 다른 해결책을 원합니다.

이게 말이 돼요, 누구?감사해요.

call_user_func 함수 사용:

http://php.net/manual/en/function.call-user-func.php

예:

call_user_func('myClassName_' . $language . '::myFunctionName');

당신이 할 수 있다고 생각합니다.

$classname = 'myClassName_' . $language;
$result = $classname::myFunctionName();

이를 가변 함수라고 합니다.

공장에서 당신이 필요로 하는 수업을 만드는 것을 캡슐화하겠습니다.

이렇게 하면 기본 이름을 변경하거나 언어를 올바른 클래스로 매핑하는 규칙을 변경해야 할 때 하나의 진입점을 갖게 됩니다.

    class YourClassFactory {

        private $_language;
        private $_basename = 'yourclass';

        public YourClassFactory($language) {
            $this->_language = $language;
        }

        public function getYourClass() {
            return $this->_basename . '_' . $this->_language;
        }    
    } 

사용해야 할 경우:

$yourClass = $yourClassFactoryInstance->getYourClass();
$yourClass::myFunctionName();

temuri의 말처럼 '$className::functionName'을(를) 시도하면 구문 분석 오류가 발생합니다.

구문 분석 오류: 구문 오류, 예기치 않은 T_PAAMAYIM_NEKUDOTAYIM...

제 경우(2개의 인수가 있는 정적 방법), 가장 좋은 해결책은 2개의 배열이 있는 call_user_func_array를 사용하는 것입니다(nikc.org 에서 제안하는 바와 같이).

$result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));

BR

비록 당신이 처리하는 방식이 매우 나쁜 생각이라고 생각하지만, 해결책이 있을 수도 있다고 생각합니다.

$className = 'myClassName_'.$language;
$result = $className::myFunctionName();

나는 이것이 당신이 원하는 것이라고 생각합니다.

다음 작업을 쉽게 수행할 수 있습니다.

<?php

class B {

    public static $t = 5;

    public static function t($h) {
        return "Works!" . $h;
    }
}

$g = 't';
$class = 'B';

echo $class::$g('yes'); //Works! Yes

그리고 PHP 5.2 >=에서 테스트하면 잘 될 것입니다.

질문을 이해할 수 있는 한, get_class 함수를 사용하여 할 수 있는 클래스 이름을 구하셔야 합니다.반면, Reflection 클래스는 OOP 방식으로 메소드, 인수 등과 관련하여 유용하게 사용할 수 있습니다.

다음과 같은 솔루션:

$yourClass::myFunctionName();

작동하지 않습니다.PHP에서 구문 분석 오류가 발생합니다.

불행하게도, 유일한 방법은 매우 느리게 사용하는 것입니다. call_user_func().

오래된 스레드라는 것은 알지만 PHP 5.3.0 현재 forward_static_call을 사용해야 합니다.

$result = forward_static_call(array('myClassName_EN', 'myFunctionName'));

$language 변수를 사용하면 다음과 같습니다.

$result = forward_static_call(array('myClassName_' . $language, 'myFunctionName'));

언급URL : https://stackoverflow.com/questions/2108795/dynamic-static-method-call-in-php

반응형