programing

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

nasanasas 2020. 12. 10. 20:29
반응형

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();

당신이 거래하는 방식이 매우 나쁜 생각이라고 생각하지만 해결책이있을 수 있습니다

$className = 'myClassName_'.$language;
$result = $className::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


내가 귀하의 질문을 이해할 수있는 한, get_class 함수를 사용하여 수행 할 수있는 클래스 이름을 가져와야 합니다. 반면에 Reflection 클래스 는 OOP 방식의 메서드, 인수 등에 관한 한 훌륭한 여기에서 도움이 될 수 있습니다.


다음에 쉽게 할 수 있습니다.

<?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에서 테스트되었습니다.


다음과 같은 솔루션 :

$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

반응형