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
'programing' 카테고리의 다른 글
SVN 저장소를 다른 SVN 저장소로 마이그레이션하려면 어떻게합니까? (0) | 2020.12.10 |
---|---|
PHP 문자열에서 제어 문자 제거 (0) | 2020.12.10 |
보이는 테이블 행 수를 계산하는 jquery 선택기? (0) | 2020.12.10 |
모델에서 언제`save`와`save!`를 사용해야합니까? (0) | 2020.12.10 |
Eclipse 프로젝트에서 Log4j.properties를 넣을 올바른 위치는 어디에 있습니까? (0) | 2020.12.10 |