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
'sourcetip' 카테고리의 다른 글
두 AVL 트리 연결/병합/접합 (0) | 2023.11.04 |
---|---|
오라클에서 id의 중복 행마다 하나의 레코드만 얻는 방법은? (0) | 2023.11.04 |
PowerShell로 이메일 보내는 방법 (0) | 2023.11.04 |
CSS to set A4 paper size (0) | 2023.11.04 |
파워셸: Get-Item vs Get-ChildItem (0) | 2023.11.04 |