PHP 별 회의 파라미터 및 기본 널
-
07-07-2019 - |
문제
우리에게 방법과 같은 메소드 서명이 있다고 가정 해 봅시다
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을 통과하는 대신 유사한 구문.
그러나 그렇지 않으므로 더미 변수를 사용해야합니다.
@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를 보여주었습니다.