PHP에서 함수의 별칭을 지정하는 방법은 무엇입니까?
PHP에서 다른 이름으로 함수의 별칭을 지정할 수 있습니까?이름을 가진 함수가 있다고 가정합니다.sleep
에일리어스를 만들 수 있는 방법이 있습니까?wait
?
지금쯤 저는 이렇게 하고 있습니다.
function wait( $seconds ) {
sleep($seconds);
}
PHP 5.5까지
네.function wait ($seconds) { sleep($seconds); }
가는 길입니다.그러나 wait()를 변경해야 하는 경우 sleep()에 대한 매개 변수 수를 변경해야 하는 경우 대신 다음을 수행하는 것이 좋습니다.
function wait() {
return call_user_func_array("sleep", func_get_args());
}
PHP 5.6+만 해당
PHP 5.6부터는 함수를 가져와서 별칭을 지정할 수 있습니다.
use function sleep as wait;
설명서에도 예제가 있습니다("함수 별칭 지정" 참조).
아니요, 하지만 당신은 할 수 있습니다.
$wait = 'sleep';
$wait($seconds);
이러한 방식으로 인수-번호-문제도 해결할 수 있습니다.
당신이 PHP 5.3을 가지고 있다면 람다스도 볼 수 있습니다.
$wait = function($v) { return sleep($v); };
만약 당신이 PHP의 "eval" 명령어를 사용하는 것에 관심이 없다면 (많은 사람들이 실제로 문제가 있지만 나는 그렇지 않다), 다음과 같은 것을 사용할 수 있습니다.
function func_alias($target, $original) {
eval("function $target() { \$args = func_get_args(); return call_user_func_array('$original', \$args); }");
}
몇 가지 간단한 테스트에서 사용했는데, 꽤 잘 작동하는 것 같았습니다.다음은 예입니다.
function hello($recipient) {
echo "Hello, $recipient\n";
}
function helloMars() {
hello('Mars');
}
func_alias('greeting', 'hello');
func_alias('greetingMars', 'helloMars');
greeting('World');
greetingMars();
아니요, PHP에서는 이것을 빠르게 할 수 있는 방법이 없습니다.이 언어는 래퍼 함수를 작성하지 않고 함수에 별칭을 지정하는 기능을 제공하지 않습니다.
만약 당신이 정말로 이것이 필요하다면, 당신은 이것을 할 수 있는 PHP 확장자를 쓸 수 있습니다.그러나 확장자를 사용하려면 확장자를 컴파일하고 PHP를 이 확장자로 구성해야 하므로 응용 프로그램의 이식성이 크게 저하됩니다.
아니요, 기능은 1등 시민이 아니기 때문에 없습니다.wait = sleep
예를 들어 Javascript와 같은.당신은 기본적으로 당신의 질문에 입력한 것을 해야 합니다.
function wait ($seconds) { sleep($seconds); }
런킷 확장을 사용할 수 있습니다.
http://us.php.net/manual/en/function.runkit-function-copy.php
function alias($function)
{
return function (/* *args */) use ($function){
return call_user_func_array( $function, func_get_args() );
};
}
$uppercase = alias('strtoupper');
$wait = alias('sleep');
echo $uppercase('hello!'); // -> 'HELLO!'
$wait(1); // -> …
PHP가 xasy 구문 사용을 지원하지 않는 경우 이전 PHP 버전에서 익명 함수를 정의할 수 있습니다.
$wait = create_function('$seconds', 'sleep($seconds);');
$wait(1);
또는 상수 내부에 코드를 배치합니다. 예:
define('wait', 'sleep(1);');
eval(wait);
참고 항목:eval() 대신 사용할 수 있는 것은 무엇입니까?
이 기능은 코드 조각이 길어서 반복하지 않으려는 경우나 코드가 새 기능에도 유용하지 않은 경우에 특히 유용합니다.
사용자 함수의 별칭을 만드는 데 매우 유용한 Dave H가 게시한 함수도 있습니다.
function create_function_alias($function_name, $alias_name)
{
if(function_exists($alias_name))
return false;
$rf = new ReflectionFunction($function_name);
$fproto = $alias_name.'(';
$fcall = $function_name.'(';
$need_comma = false;
foreach($rf->getParameters() as $param)
{
if($need_comma)
{
$fproto .= ',';
$fcall .= ',';
}
$fproto .= '$'.$param->getName();
$fcall .= '$'.$param->getName();
if($param->isOptional() && $param->isDefaultValueAvailable())
{
$val = $param->getDefaultValue();
if(is_string($val))
$val = "'$val'";
$fproto .= ' = '.$val;
}
$need_comma = true;
}
$fproto .= ')';
$fcall .= ')';
$f = "function $fproto".PHP_EOL;
$f .= '{return '.$fcall.';}';
eval($f);
return true;
}
아니요. 당신이 쓴 방법이 그것을 하는 가장 좋은 방법입니다.
아니요, 그렇게 하는 빠른 방법은 없습니다 - 적어도 PHP v5.3 이전의 어떤 것에 대해서도, 그렇게 하는 것이 특별히 좋은 생각은 아닙니다.그것은 단순히 문제를 복잡하게 만듭니다.
PHP 5.6 이후
이것은 특히 마술 방법이 있는 수업에서 사용하는 데 도움이 됩니다.
class User extends SomethingWithMagicMethods {
public function Listings(...$args) {
return $this->Children(...$args);
}
}
하지만 저는 그것이 일반적인 기능에도 작동한다고 꽤 확신합니다.
function UserListings(...$args) {
return UserChildren(...$args);
}
출처: PHP: 새로운 기능 -> "Variadic functions via..."
다른 방법:
<?php
function wait(...$args) {
// Unpack the arguments
sleep(...$args);
}
?>
이렇게 하면 원래 함수를 호출하는 방식과 마찬가지로 별칭을 호출할 수 있습니다.함수가 둘 이상의 인수를 허용하는 경우.
오래된 일인 건 알지만 언제든
$wait = 'sleep';
$wait();
우리 반에서 사용한 것
function __call($name, $args) {
$alias['execute']=array('done','finish');
$alias['query']=array('prepare','do');
if (in_array($name,$alias['execute'])){
call_user_func_array("execute",$args);
return TRUE;
}elseif(in_array($name,$alias['query'])){
call_user_func_array("query",$args);
return TRUE;
}
die($this->_errors.' Invalid method:'.$name.PHP_EOL);
}
언급URL : https://stackoverflow.com/questions/1688711/how-to-alias-a-function-in-php
'it-source' 카테고리의 다른 글
프로그래밍 방식으로 사용자 정의 보기 크기를 조정하는 방법 (0) | 2023.08.04 |
---|---|
Android - CheckBox와 텍스트 사이의 간격 (0) | 2023.08.04 |
Application Insight 메트릭에서 각 요청에 대한 사용자 지정 속성 추가 (0) | 2023.08.04 |
XMLHttpRequest 대 HttpRequest (0) | 2023.08.04 |
엔티티 개체를 저장소에서 노출해야 합니까? (0) | 2023.08.04 |