문제

우리에게 방법과 같은 메소드 서명이 있다고 가정 해 봅시다

public static function explodeDn($dn, array &$keys = null, array &$vals = null,
    $caseFold = self::ATTR_CASEFOLD_NONE)

모든 매개 변수를 생략하여 메소드를 쉽게 호출 할 수 있습니다. $dn:

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com');

3 개의 매개 변수로 메소드를 호출 할 수도 있습니다.

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, $v);

그리고 4 개의 매개 변수로 :

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, $v, 
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER);

그러나 예를 들어 다음 매개 변수 조합으로 메소드를 호출하는 것이 불가능한 이유는 무엇입니까?

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, null, 
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER);
$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', null, $v);

통과의 차이점은 무엇입니까? null 메소드와 기본값에 의존합니까? 이 제약 조건은 매뉴얼로 작성 되었습니까? 우회 할 수 있습니까?

도움이 되었습니까?

해결책

Null에 대한 언급을 할 수 없기 때문입니다.

NULL이 포함 된 변수에 대한 참조를 가질 수 있습니다. 이것이 바로 기본값이하는 일입니다. 또는 당신은 null을 문자 그대로 값으로 전달할 수 있습니다. 그러나 당신은 아웃 매개 변수를 원하기 때문에 여기서는 불가능합니다.

다른 팁

NULL을 명시 적으로 전달하려면 By-REF 인수에 대한 더미 변수를 만들어야하지만 별도의 라인에서 해당 변수를 만들 필요는 없습니다. $ dummy = null과 같은 할당 표현식을 함수 인수로 직접 사용할 수 있습니다.

function foo (&$ref = NULL) {

    if (is_null($ref)) $ref="bar";
    echo "$ref\n";        
}

foo($dummy = NULL); //this works!

나는 방금 이것을 직접 알았고, 나는 꽤 충격을 받고있다 o_o!

이것이 바로 PHP 문서 말 :

function makecoffee($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee(); // returns "Making a cup of cappuccino."
echo makecoffee(null); // returns "Making a cup of ."
echo makecoffee("espresso"); // returns "Making a cup of espresso."

나는 기대했을 것이다 makecoffee(null) "카푸치노 컵 만들기"를 반환합니다. 내가 사용한 한 가지 해결 방법은 인수가 null 인 경우 기능 내부를 확인하는 것입니다.

function makecoffee($type = null)
{
    if (is_null($type)){ 
       $type = "capuccino";
    }
    return "Making a cup of $type.\n";
}

지금 makecoffee(null) "카푸치노 컵 만들기"를 반환합니다.

(나는 이것이 실제로 Zend 관련 질문을 해결하지는 못한다는 것을 알고 있지만 일부는 유용 할 수 있습니다 ...)

@ tomalak

실제로 기본값은 참조와 관련없이 변수를 만듭니다. 당신이 무언가를 통과 할 때 단순히 시작할 수없는 것입니다.

그 이유를 설명하기 위해 찾은 것은 다음 예입니다 (테스트하지 않은).

function foo (&$ref = NULL) {
  $args = func_get_args();
  echo var_export($ref, TRUE).' - '.var_export($args, TRUE);
}
$bar = NULL;
foo();     // NULL - array()
foo($bar); // NULL - array(0 => NULL)

내 생각에, PHP는
foo($p1, , , $p4); 또는 NULL을 통과하는 대신 유사한 구문.
그러나 그렇지 않으므로 더미 변수를 사용해야합니다.

무엇을 확인하기 위해 토말락 정해진 여기:

다음 작품 :

$k=array();
$v=null;
$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, $v, 
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER);

좋지는 않지만 설명은 명확하고 이해할 수 있습니다.

@aschmecher가 의견을 지적했듯이@szczepan의 답변, 행위 func($var = null) 엄격한 표준 통지를 생성합니다.

하나의 해결책

다음은 그러한 경고를 생성하지 않는 방법입니다.

<?php
error_reporting(E_ALL | E_STRICT);

function doIt(&$x = null) {
    if($x !== null) echo "x not null: $x\n";
    $x = 2;
}

function &dummyRef() {
    $dummyRef = null;
    return $dummyRef;
}

doIt(dummyRef());

doIt(dummyRef());

설명

변수를 통과하는 대신 참조를 반환하는 함수의 결과를 전달합니다. 두 번째 전화 doIt(dummy()) 참조를 확인하는 것입니다 $dummy 값은 통화간에 지속되지 않습니다. 이것은 축적 된 값을 지우는 것을 기억 해야하는 변수를 명시 적으로 생성하는 것과 대조됩니다.

$dummyRef = null;
doIt($dummyRef);
doIt($dummyRef); // second call would print 'x not null: 2'

신청

OP의 예에서는 다음과 같습니다.

$dn = Zend_Ldap_Dn::explodeDn(
    'CN=Alice Baker,CN=Users,DC=example,DC=com',
    $k,
    dummyRef(),
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER
);

추가 고려 사항

내가 걱정할 수있는 한 가지는이 메소드가 메모리 누출을 생성하는지 여부입니다. 다음 테스트는 그렇지 않다는 것을 보여줍니다.

<?php
function doItObj(&$x = null) {
    if(gettype($x) !== "object") echo "x not null: $x\n";
    $x = 2;
}

function &dummyObjRef() {
    $dummyObjRef = new StdClass();
    return $dummyObjRef;
}

echo "memory before: " . memory_get_usage(true) .  "\n";

for($i = 0; $i < 1000000; $i++) {
    doItObj(dummyObjRef());
}

echo "memory after: " . memory_get_usage(true) . "\n";

echo "\n$i\n";

내 시스템 (PHP 5.6.4 사용)에서 Memory_Get_usage에 대한 두 호출은 ~ 262 KB를 보여주었습니다.

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