Проблема с передачей параметра функции по умолчанию, если параметр - ссылка

Ямерт

The Old One
Проблема с передачей параметра функции по умолчанию, если параметр - ссылка

Возможно ли это в принципе?
Т.е. конструкция типа
PHP:
function Foo ($arg_byval, &$arg_byref=<something>)
{...}
&$arg_byref=null не работает.

Можно, конечно, на крайний случай просто нагло не передавать этот параметр, имея декларацию функции
PHP:
function Foo ($arg_byval, &$arg_byref)
и подавляя соотв. варгнинг через error_reporting(), но это уже дикий изврат.

Полазил по PHP.net, но ответа на этот вопрос не нашёл (может, плохо искал).
Жаль, ПХП не поддерживает перегрузку функций...
 

Demiurg

Guest
хм .. в php обычно параметр передают по ссылке, что бы потом его изменять. А что ты будешь менять, если тебе ничего не передадут. Можно узнать для чего это ?
 

Ямерт

The Old One
Да собственно, ни для чего конкретного - просто эксперементирую. Я подумал: если обычному параметру можно задать дефолтное значение, то и ссылке, вероятно, тоже.

обычно параметр передают по ссылке, что бы потом его изменять. А что ты будешь менять, если тебе ничего не передадут.
если переменная-параметр занимает значительное количество памяти, тоже имеет смысл передавать её по ссылке, в то же время не преследуя цель менять её содержимое.
 

ErrN0

Guest
так же имхо есть смысл передавать по ссылке если в переменной большое количество данных...

так же экземпляры классов я предпочитаю передавать по ссылке :)

у этой проблемы похоже решения нет...

З.Ы. жаль что в пхп функции перегружать нельзя :(
 

Demiurg

Guest
А с чего вы взяли, что в php при передаче по значению происходит копирование большого количества данных ?
 

Demiurg

Guest
PHP:
<?
function A(&$a)
{
	return strlen($a);
}

$a = '... 15 килобайт текста ... ';
echo A($a);
?>
Total transferred: 19500 bytes
HTML transferred: 800 bytes
Requests per second: 102.77 [#/sec] (mean)
Time per request: 9.73 [ms] (mean)
Time per request: 9.73 [ms] (mean, across all concurrent requests)
Transfer rate: 20.04 [Kbytes/sec] received


тоже самое, но function A($a) :
Total transferred: 19500 bytes
HTML transferred: 800 bytes
Requests per second: 106.61 [#/sec] (mean)
Time per request: 9.38 [ms] (mean)
Time per request: 9.38 [ms] (mean, across all concurrent requests)
Transfer rate: 20.79 [Kbytes/sec] received

голый язык цифр :)
 

ErrN0

Guest
Demiurg: а как может это происходить по-другому нежели чем копирование?

при передаче не ссылкой, создается копия переменной, т.е. сжирается еще 15К памяти... при передаче ссылкой - нет.
Однако как пишет Лексдорф, передача по ссылке относительно медленная операция, и целесообразна при "large data sructs"

http://www.lerdorf.com/tips.pdf
 

Demiurg

Guest
>а как может это происходить по-другому нежели чем копирование?
Ну мало ли. Я вообще не знаю, как физически представлены данные в PHP, так что для меня передача по ссылке здесь давольно абстрактное понятие. Но тесты говорят за себя.
 

su1d

Старожил PHPClubа
в тех же tips.pdf расмус пишет о том, что объекты лучше передавать по ссылке, дабы избежать всяких забавных глюков, связанных с незаметным копированием объектов.
 

young

Новичок
опрдели фунцию как

<?php
function foo() {
$numargs = func_num_args();
echo "Number of arguments: $numargs<br>\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg (1) . "<br>\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "<br>\n";
}
}

foo (1, 2, 3);
?>
 

.des.

Поставил пиво кому надо ;-)
Если - не происходит изменение параметра в функции, то никакого копирования не происходит.
Так что в случае если это параметр для чтения, то можешь даже не задумываясь его передавать by value
А вот и практическое подтверждение сего.

http://phpclub.net/talk/showthread.php?s=&threadid=24554

Что касается варианта приведенного young что то я не вижу здесь передачи по ссылке. Это подмена условия, а не решение задачи.

И вообще, а как вы себе представляете данный механизм?
если мы передаем второй параметр, то используется ссылка на него - некий участок памяти. А если нет!? То создается автоматически?
 

Lomik

Guest
2Demiurg
попробуй в своем примере в функции A($a) как-то изменять содержимое переменной $a. И погляди на результаты тестов.
Насколько я помню, ПХП, передавая параметр в ф-цию, просто передает ссылку на память. И если ты с переменной внутри ф-ции ничего не делаешь, то никакого копирования не будет. Но если ты будешь ее изменять, то ПХП создает копию. Соответственно твой тест не совсем обьективный.
 

.des.

Поставил пиво кому надо ;-)
Насколько я помню, ПХП, передавая параметр в ф-цию, просто передает ссылку на память. И если ты с переменной внутри ф-ции ничего не делаешь, то никакого копирования не будет. Но если ты будешь ее изменять, то ПХП создает копию. Соответственно твой тест не совсем обьективный
Именно об этом я и говорю. По ссылке пройдии ознакомься с результами тестов.
 

Demiurg

Guest
PHP:
function A($a)
{
	$a .= 'a';
	return strlen($a);
}
by value:
Total transferred: 19500 bytes
HTML transferred: 800 bytes
Requests per second: 103.31 [#/sec] (mean)
Time per request: 9.68 [ms] (mean)
Time per request: 9.68 [ms] (mean, across all concurrent requests)
Transfer rate: 20.14 [Kbytes/sec] received

by reference:
Total transferred: 19500 bytes
HTML transferred: 800 bytes
Requests per second: 102.67 [#/sec] (mean)
Time per request: 9.74 [ms] (mean)
Time per request: 9.74 [ms] (mean, across all concurrent requests)
Transfer rate: 20.02 [Kbytes/sec] received
 
Сверху