1. PHP / Говнокод #26007

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    /**
    	* <p>Статический метод размещает все аргументы и ключи по парам.</p> <p>Нечетные аргументы - массивы, четные - ключи, по которым искать в массивах.</p> <p>Ключи могут быть массивами. В этом случае поиск происходит во вложенных массивах. Возвращает первый не пустой элемент пары аргумент/ключ.</p>
    	*
    	*
    	* @param array $arraya  массив для анализа
    	*
    	* @param array $string  Ключи поиска
    	*
    	* @param strin $integerk  Неограниченные последовательно проверяемые пары массив\ключ
    	*
    	* @param integer $mixeda  
    	*
    	* @return mixed 
    	*
    	* @static
    	* @link http://dev.1c-bitrix.ru/api_d7/bitrix/main/type/collection/firstnotempty.php
    	* @author Bitrix
    	*/
    	public static function firstNotEmpty()
    	{
    		$argCount = func_num_args();
    		for ($i = 0; $i < $argCount; $i += 2)
    		{
    			$anArray = func_get_arg($i);
    			$key = func_get_arg($i+1);
    			if (is_array($key))
    			{
    				$current = &$anArray;
    				$found = true;
    				foreach ($key as $k)
    				{
    					if (!is_array($current) || !array_key_exists($k, $current))
    					{
    						$found = false;
    						break;
    					}
    					$current = &$current[$k];
    				}
    				if ($found)
    				{
    					if (is_array($current) || is_object($current) || $current != "")
    						return $current;
    				}
    			}
    			elseif (is_array($anArray) && array_key_exists($key, $anArray))
    			{
    				if (is_array($anArray[$key]) || is_object($anArray[$key]) || $anArray[$key] != "")
    					return $anArray[$key];
    			}
    		}
    		return "";
    	}

    Чо ?

    Запостил: phpBidlokoder2, 01 Ноября 2019

    Комментарии (15) RSS

    • кажется что формальных параметров чуть меньше, чем документирвоанных
      Ответить
      • В «PHP» можно объявить функцию с пустыми скобочками, а аргументы извлекать вызовом func_get_args() либо func_num_args() и func_get_arg($i).

        Так что по факту у всех функций список параметров вариативный.
        Ответить
        • как удобно) у нас в перле тоже нет формальных параметров.

          >"Нечетные аргументы - массивы, четные - ключи"
          Это тоже очень удобно, напоминает планары из некоторых режимов VGA

          Вообще семантика у функции - ок
          Ответить
          • Но в «Перле» формальных параметров нет никогда, а в «PHP» хочешь — указывай, не хочешь — не указывай. Именно поэтому я за «PHP».
            Ответить
            • >никогда

              WARNING: Subroutine signatures are experimental. The feature may be modified or removed in future versions of Perl.

              sub foo ($left, $right) {
              	return $left + $right;
                  }


              какой багор
              Ответить
              • Погуглил сообщение об ошибке:
                https://metacpan.org/pod/perlsub

                Оказывается, в «Перле» есть СИГНАТУРЫ и ПРОТОТИПЫ.

                There is a potential syntactic ambiguity between signatures and prototypes (see "Prototypes"), because both start with an opening parenthesis and both can appear in some of the same places, such as just after the name in a subroutine declaration.

                Сигнатуры выглядят так же, как в других языках программирования. А вот прототипы — какое-то прыщеблядство:
                sub myref (\[$@%&*])


                The + prototype is a special alternative to $ that will act like \[@%] when given a literal array or hash variable, but will otherwise force scalar context on the argument.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                • куик
                  прототайпы это офигенный костылёк, который к тому же иногда не работает.

                  Смысл вот в чем

                  В перле функция всегда получает массив параметров. Чтобы ты ей ни передал -- это что-то всегда раскроется в списковом контексте в массив.

                  Если ты попытаешься ей передать массив, то он ей и скопируется.
                  Если передаешь два массива -- они сольются воедино и передадутся (как это с ними случается в списковом контексте)

                  Если ты хочешь изменить что-то в массиве (ну или просто чтобы быстро работало) ты хочешь получить массив по ссылке.

                  Можно вручную при вызове функции сказаить

                  foo \@myarr;

                  тогда функция получит массив из одной ссылки на массив myarr;

                  А можно в прототипе явно сказать

                  sub foo(\@)
                  эт будет как & в крестах или ref в C#.

                  Тогда перл поймет, что ты ожыдаешь рефересн, и явно тебе ее передаст.

                  Но это работает только если функция диспачнулась статически. А иначе перл про нее ничего не знает.
                  Потому это не работает при указателях на функции.

                  И, соответственно, не работает при ооп так как диспатчится вызов метода динамически.

                  А еще не работает при префиксировании функции &, так как это старый синтаксис
                  use strict;
                  use warnings;
                  
                  my @users = qw(rms deraat matz);
                  
                  sub no_gnu(\@) {
                  	my $usersRef = shift;
                  	@$usersRef = grep !/rms/, @$usersRef;
                  
                  }
                  
                  # Works
                  no_gnu @users;
                  
                  &no_gnu(@users); #Fail
                  my $fRef = \&no_gnu;
                  &$fRef(@users); #Fail
                  $fRef->(@users); #fail
                  
                  print join ',', @users;
                  Ответить

    Добавить комментарий