Intereting Posts
Замените новые строки, но сохраняйте пустые строки «Нет приемлемого варианта» из MultiViews в Apache как отправить html-почту с помощью почты PEAR Обязательные пользовательские поля проверки WooCommerce не подтверждают введенное значение Скопируйте изображение буфера обмена на веб-страницу с помощью JQuery Строка конкатенации против массива imode в PHP Как я могу создать собственное регулярное выражение для «разбора» ссылок HTML? PDO не возвращает результатов, тогда как командная строка MySQL возвращает ожидаемый результат Представление JQuery / Ajax (enctype = "multipart / form-data"). Почему «contentType: False» вызывает неопределенный индекс в PHP? Почему в этом случае не работает функция PHP imagettftext? Как выполнить регулярное выражение URL для структуры маршрутизации? Как я могу определить / рассчитать, есть ли маленькие изображения внутри большего изображения? Переписать HTTP-запрос GET на POST в Apache с помощью htaccess Галерея изображений, например, Getty Images, но без базы данных MySQL возвращает только одну строку

Параметры привязки PHP по умолчанию и значение по умолчанию

Допустим, у нас есть подпись метода, например

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'); 

Мы также можем вызвать метод с тремя параметрами:

 $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 как буквальное значение, но поскольку вам нужен параметр out, здесь это невозможно.

Хотя вы должны создать фиктивную переменную для аргументов by-ref, если вы хотите явно передать NULL, вам не нужно создавать эту переменную на отдельной строке. Вы можете использовать выражение присваивания, например $ 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, но это может быть полезно для некоторых …)

@ Томалак

Фактически, значение по умолчанию создает переменную без какой-либо ссылки. Это то, что вы просто не можете начать, когда вы что-то передаете.

То, что я нахожу, чтобы проиллюстрировать причины, – это следующий пример (который я не тестировал):

 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 КБ.