"PHP" / Говнокод #26007 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 phpBidlokoder2, (Updated )

Комментарии (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.
              Ответить
              • > \[$@%&*]
                это ссылка на массив со скларяом, массиом, хешем, функцией и баребухомвордом?

                охуенно:))) Вот вы так заебали меня своим Джей, что я вас теперь буду заебывать
                sub try (&@) {
                    my($try,$catch) = @_;
                    eval { &$try };
                    if ($@) {
                        local $_ = $@;
                        &$catch;
                    }
                }
                sub catch (&) { $_[0] }
                 
                try {
                    die "phooey";
                } catch {
                    /phooey/ and print "unphooey\n";
                };
                Ответить
              • куик
                прототайпы это офигенный костылёк, который к тому же иногда не работает.

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

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

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

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

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

                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;
                Ответить
                  • бекслеш это взятие ссылки.

                    $petuh = "petuh";
                    @petuhi = ($petuh, "kurochka");

                    $petuhRef = \$petuh;
                    $petuhiRef = \@petuhi;
                    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8