문제

이 질문에 대한 대답은 '아니요'라고 확신합니다. 하지만 PHP 전문가가 있는 경우를 대비해

유효하지 않은 인수나 존재하지 않는 변수가 전달될 수 있고 PHP를 사용하지 않고도 PHP에서 오류가 발생하지 않는 방식으로 함수를 작성하는 것이 가능합니까? '@'

비어 있고 isset과 매우 유사합니다.방금 구성한 변수를 전달할 수 있으며 오류가 발생하지 않습니다.

ex:

empty($someBogusVar); // no error

myHappyFunction($someBogusVar); // Php warning / notice
도움이 되었습니까?

해결책

정리하자면 정답은 아니, 그러면 안 돼 (아래 주의사항 참조).

이 스레드에는 조건에 참조 변수나 isset() 또는 empty()를 사용하고 PHP 구성에서 알림을 억제하는 등 이미 많은 사람들이 언급한 해결 방법이 있습니다.이는 명백한 해결 방법 외에도 원하지 않는 @를 사용하는 것입니다.

흥미로운 의견 토론을 요약하면 독일 사람:참조로 변수를 전달하는 것은 다음과 같은 경우 실제로 유효합니다. 함수 내부의 변수 값을 확인하십시오. 정의되지 않았거나 null인 경우를 적절하게 처리합니다.PHP를 종료하는 방법으로 참조 전달을 사용하지 마십시오(이것은 내 원본이 가리켜서는 안되는 곳입니다).

다른 팁

변수가 참조로 전달되면 오류가 발생하지 않습니다(PHP는 자동으로 새 변수를 생성합니다).

 function myHappyFunction(&$var)
 {       
 }

그러나 프로그래밍 오류를 숨기기 위해 이것을 남용하지 않는 것이 좋습니다.

다음과 같이 func_get_args를 사용하여 이 작업을 수행할 수 있습니다.

error_reporting(E_ALL);
ini_set('display_errors', 1);

function defaultValue() {
    $args = func_get_args();

    foreach($args as $arg) {
        if (!is_array($arg)) {
            $arg = array($arg);
        }
        foreach($arg as $a) {
            if(!empty($a)) {
                return $a;
            }
        }
    }

    return false;
}

$var = 'bob';

echo defaultValue(compact('var'), 'alpha') . "\n"; //returns 'bob'
echo defaultValue(compact('var2'), 'alpha') . "\n"; //returns 'alpha'
echo defaultValue('alpha') . "\n"; //return
echo defaultValue() . "\n";

이 기능은 한 단계 더 나아가 임의 개수의 인수 중 비어 있지 않은 첫 번째 값을 제공합니다(항상 최대 2개의 인수만 사용하도록 강제할 수 있지만 이렇게 하는 것이 나에게는 더 유용해 보입니다).

편집하다:원래 버전은 args 배열을 만들기 위해 컴팩트를 사용하지 않았으며 여전히 오류가 발생했습니다.오류 보고 기능이 한 단계 향상되었으며 컴팩트가 포함된 이 새 버전은 약간 덜 깔끔하지만 여전히 동일한 작업을 수행하고 존재하지 않는 변수에 기본값을 제공할 수 있습니다.

확인이 번거롭고 불필요해지는 경우가 있습니다.
그래서 나는 이 작은 마법 함수를 작성했습니다:

/**
 * Shortcut for getting a value from a possibly unset variable.
 * Normal:
 *   if (isset($_GET['foo']) && $_GET['foo'] == 'bar') {
 * Short:
 *   if (value($_GET['foo']) == 'bar') {
 *
 * @param mixed  $variable 
 * @return mixed  Returns null if not set
 */
function value(&$variable) {
    if (isset($variable)) {
        return $variable;
    }
}

myHappyFunction()을 변경할 필요가 없습니다.
당신은 변화해야 할 것이다

myHappyFunction($someBogusVar);

에게

myHappyFunction(value($someBogusVar));

의도를 명시적으로 명시합니다.그것은 그것을 만든다 좋은 연습 내 책에.

아니요, 이는 실제로 기능과 관련이 없기 때문입니다.존재하지 않는 배열 키를 역참조하려고 하면 오류가 발생합니다.이러한 오류를 억제하기 위해 PHP 설정의 경고 수준을 변경할 수 있지만, 이렇게 하지 않는 것이 더 좋습니다.

그러고보니 당신은 ~할 수 있었다 다음과 같은 일을 해라

function safeLookup($array, $key)
{
  if (isset($array, $key))
    return $array[$key];

  return 0;
}

그리고 배열 키 조회 대신 사용하세요.

defaultValue(safeLookup($foo, "bar"), "baz);

이제 샤워를 해야겠어요 :)

잘못된 인수나 존재하지 않는 변수를 전달할 수 있고 '@'을 사용하지 않으면 PHP에서 오류가 발생하지 않는 방식으로 함수를 작성하는 것이 가능합니까?

그래 넌 할수있어!

porneL이 맞습니다. [편집:그의 답변에 연결하거나 투표할 포인트가 충분하지 않지만 이 페이지에 있습니다.]

그는 또한 경고 할 때 맞습니다. "프로그래밍 오류를 숨기는 데 이것을 학대하는 것이 좋습니다." 그러나 이와 같은 이유로 오류 제어 연산자 (@)를 통한 오류 억제도 피해야합니다.

저는 Stack Overflow를 처음 접하지만, 정답이 투표를 받지 못하는 동안 잘못된 답변이 페이지에서 가장 높은 순위를 차지하는 경우가 흔하지 않기를 바랍니다.:(

@브라이언:나는 나를 위해 확인을 수행하기 위해 삼항 연산을 사용합니다.

return $value ? $value : $default;

이는 $value 또는 $default를 반환합니다.$value의 값에 따라 다릅니다.0, false, 비어 있거나 $default의 값과 유사한 값이 반환됩니다.

저는 empty() 및 isset()과 같은 함수를 에뮬레이트하는 데 더 도전하고 있습니다.

@Sean Brian이 이미 답변했습니다.

return isset($input) ? $input : $default;

션, 당신은 할 수 있습니다:

$result = ($func_result = doLargeIntenseFunction()) ? $func_result : 'no result';

편집하다:

Ternary Operator VRS 기능 호출에 대한 훌륭한 토론이있을 수 있다고 확신합니다.그러나이 질문의 요점은 '@'를 사용하지 않고 존재하지 않는 값을 전달하는 경우 오류를 던지지 않는 함수를 만들 수 있는지 확인하는 것이 었습니다.

그리고 내가 말했잖아, 확인해봐 isset().삼항 조건문의 첫 번째 부분은 null 또는 null이 아닌지 확인하지 않고 확인합니다. true 또는 false.확인하려고 하면 true 또는 false PHP의 null 값에서는 이러한 경고가 표시됩니다. isset() 변수나 표현식이 null 값을 반환하는지 여부를 확인하고 오류 없이 삼항의 첫 번째 부분에서 평가할 수 있는 부울을 반환합니다.

삼항 연산자 vrs 함수 호출에 관해 훌륭한 토론이 있을 것이라고 확신합니다.하지만 이 질문의 요점은 '@'를 사용하지 않고 존재하지 않는 값이 전달되는 경우 오류를 발생시키지 않는 함수를 만들 수 있는지 확인하는 것이었습니다.

원래 질문에 대한 대답은 "아니오"이지만, 아무도 언급하지 않은 옵션이 있습니다.

@ 기호를 사용하면 PHP가 수행하는 모든 작업은 error_reporting 레벨로 설정하고 일시적으로 0으로 설정합니다.당신이 사용할 수있는 "ini_restore('error_reporting');"를 사용하여 @를 사용하기 전의 상태로 되돌립니다.

이는 변수가 설정되었는지, 다른 속성도 있는지 확인하고 그렇지 않으면 기본값을 반환하는 편의 함수를 작성하려는 상황에서 나에게 유용했습니다.하지만 설정되지 않은 변수를 전송하면 PHP 알림이 ​​발생하므로 @를 사용하여 이를 억제한 다음 설정했습니다. error_reporting 함수 내에서 원래 값으로 돌아갑니다.

다음과 같은 것 :

$var = @foo($bar);

function foo($test_var)
{
     ini_restore('error_reporting');

     if(is_set($test_var) && strlen($test_var))
     {
          return $test_var;
     }
     else
     {
          return -1;
     }
}

그래서 위의 경우라면 $bar 설정되지 않았으므로 호출할 때 오류가 발생하지 않습니다. foo() 존재하지 않는 변수로.그러나 실수로 입력한 함수 내에서 오류가 발생합니다. is_set 대신에 isset.

이는 실제 사실은 아니더라도 원래 질문이 정신적으로 요구한 내용을 다루는 유용한 옵션이 될 수 있습니다.

단순히 매개변수에 기본값만 추가하면 함수 호출 시 건너뛸 수 있습니다.예를 들어:

function empty($paramName = ""){
    if(isset($paramName){
        //Code here
    }
    else if(empty($paramName)){
        //Code here
    }
}

한 줄로 다음을 수행할 수 있습니다. myHappyFunction($someBogusVar="");

이것이 당신이 찾고 있는 것이기를 바랍니다.PHP 문서를 읽으면 아래에 기본 인수 값, 를 보면 함수의 인수에 기본값을 할당하면 함수 사용 시 오류 메시지를 방지하는 데 도움이 된다는 것을 알 수 있습니다.

이 예에서는 기본 인수 사용의 차이점과 장점을 확인할 수 있습니다.

PHP 코드:

<?php
function test1($argument)
{
    echo $argument;
    echo "\n";
}

function test2($argument="")
{
    echo $argument;
    echo "\n";
}

test1();
test1("Hello");
test1($argument);
$argument = "Hello world";
test1($argument);

test2();
test2("Hello");
test2($argument);
$argument = "Hello world";
test2($argument);
?>

다음에 대한 출력 test1() 윤곽:

경고:test1() 에 대한 인수 1이 누락되었습니다.
안녕하세요.
.
안녕하세요.

다음에 대한 출력 test2() 윤곽:

.
안녕하세요.

안녕하세요.

이는 다음과 같이 조합하여 사용할 수도 있습니다. isset() 그리고 당신이 원하는 것을 성취하기 위한 다른 기능들.

그리고 추상화 트리 위로 더 올라가면 이것을 무엇에 사용하고 있습니까?

각 클래스의 해당 값을 적절하게 초기화하거나 다음과 같이 모든 기본값과 속성을 포함하는 특정 클래스를 만들 수 있습니다.

class Configuration {

    private var $configValues = array( 'cool' => 'Defaultcoolval' ,
                                       'uncool' => 'Defuncoolval'  );

    public setCool($val) {
        $this->configValues['cool'] = $val;
    }

    public getCool() {
        return $this->configValues['cool'];
    }

}

코드의 위아래 어디에서나 defaultValue 함수를 사용할 때 값을 변경해야 할 때마다 defaultValue 호출을 넣은 모든 위치를 찾는 것은 유지 관리의 악몽이 될 것이라는 생각입니다.그리고 그것은 또한 당신이 DRY를 위반하는 반복을 하게 만들 수도 있습니다.

반면에 이는 모든 기본값을 저장하는 단일 장소입니다.이러한 setter 및 getter를 생성하지 않으려는 유혹을 받을 수도 있지만 출력 수정이나 입력 검증을 수행하는 것이 적절한 경우 유지 관리에도 도움이 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top