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

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
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
class MediaWiki {
// Поля, другие методы

private function performRequest() {
		global $wgTitle;

		$request = $this->context->getRequest();
		$requestTitle = $title = $this->context->getTitle();
		$output = $this->context->getOutput();
		$user = $this->context->getUser();

		if ( $request->getVal( 'printable' ) === 'yes' ) {
			$output->setPrintable();
		}

		$this->getHookRunner()->onBeforeInitialize( $title, null, $output, $user, $request, $this );

		// Invalid titles. T23776: The interwikis must redirect even if the page name is empty.
		if ( $title === null || ( $title->getDBkey() == '' && !$title->isExternal() )
			|| $title->isSpecial( 'Badtitle' )
		) {
			$this->context->setTitle( SpecialPage::getTitleFor( 'Badtitle' ) );
			try {
				$this->parseTitle();
			} catch ( MalformedTitleException $ex ) {
				throw new BadTitleError( $ex );
			}
			throw new BadTitleError();
		}

                // Check user's permissions to read this page.
		// We have to check here to catch special pages etc.
		// We will check again in Article::view().
		$permissionStatus = PermissionStatus::newEmpty();
		if ( !$this->context->getAuthority()->authorizeRead( 'read', $title, $permissionStatus ) ) {
			// T34276: allowing the skin to generate output with $wgTitle or
			// $this->context->title set to the input title would allow anonymous users to
			// determine whether a page exists, potentially leaking private data. In fact, the
			// curid and oldid request  parameters would allow page titles to be enumerated even
			// when they are not guessable. So we reset the title to Special:Badtitle before the
			// permissions error is displayed.

			// The skin mostly uses $this->context->getTitle() these days, but some extensions
			// still use $wgTitle.
			$badTitle = SpecialPage::getTitleFor( 'Badtitle' );
			$this->context->setTitle( $badTitle );
			$wgTitle = $badTitle;

			throw new PermissionsError( 'read', $permissionStatus );
		}

                // Еще какая-то логика для хандлинга редиректов по заголовкам страниц
}
// ...
}

// ...

class MessageCache implements LoggerAwareInterface {
// ...
public function parse( $text, $title = null, $linestart = true,
		$interface = false, $language = null
	) {
		global $wgTitle;

		if ( $this->mInParser ) {
			return htmlspecialchars( $text );
		}

		$parser = $this->getParser();
		$popts = $this->getParserOptions();
		$popts->setInterfaceMessage( $interface );

		if ( is_string( $language ) ) {
			$language = $this->langFactory->getLanguage( $language );
		}
		$popts->setTargetLanguage( $language );

		if ( !$title || !$title instanceof Title ) {
			$logger = LoggerFactory::getInstance( 'GlobalTitleFail' );
			$logger->info(
				__METHOD__ . ' called with no title set.',
				[ 'exception' => new Exception ]
			);
			$title = $wgTitle;
		}
		// Sometimes $wgTitle isn't set either...
		if ( !$title ) {
			# It's not uncommon having a null $wgTitle in scripts. See r80898
			# Create a ghost title in such case
			$title = Title::makeTitle( NS_SPECIAL, 'Badtitle/title not set in ' . __METHOD__ );
		}

		$this->mInParser = true;
		$res = $parser->parse( $text, $title, $popts, $linestart );
		$this->mInParser = false;

		return $res;
	} // ...
}

Зачем в методах класса вообще использовать глобальные изменяемые состояния, если это нарушает принцип инкапсуляции (для обеспечения чего и была введена абстракция класса в языки)? И сидишь гадаешь, при вызове какого метода у какого объекта у тебя слетела верстка, контент и пр. Это усложняет написание безопасных расширений для системы.

Запостил: JaneBurt JaneBurt, (Updated )

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

  • >Зачем в методах класса вообще использовать глобальные изменяемые состояния
    Потому что это "PHP")
    Ответить
    • Ну да. Основная суть Пыха - шаблонизатор страничек и обработчик форм. При такой архитектуре и десяток глобалов простительно. Странность в том, что с одной стороны пилят нечто похожее на веб-сервер с единственной точкой входа, с разделением модулей на классы. С другой - используют глобалы для передачи состояния между сущностями.
      Ответить
      • Это стандартная проблема PHP: Они как-бы пытаются сделать "правильно", они слышали что-то о красивых архитектурах, и смутно догадываются, что делают что-то не так, но что именно -- не понимают.

        Остров невезения
        Ответить
        • Они однообразия в названиях функций и порядке аргументов навести не могут. И что-то похожее на функции, что на самом деле не функции и если попытаться работать с этим, как с функциеё, всё упадёт. Когда результат вызова не-функции надо сохранять в переменную, а потом использовать её как аргумент функции, потому что если вызвать не-функцию вместо аргумента — сломается парсер...
          Ответить
          • > И что-то похожее на функции, что на самом деле не функции и если попытаться работать с этим, как с функциеё, всё упадёт

            Так это же language defined макросы, отдающие Си =)
            Ответить
            • К слову, в няшной макросню обычно всё-таки пытаются писать так, чтобы она косплеила функции или существующие конструкции языка...

              А специальный синтаксис, который работает только для двух "функций" print и echo -- это какая-то дичь, имхо. Хотя питон в молодости тоже этим страдал.
              Ответить
              • А еще array десу.

                В Rust еще круче: макрос может определять какой угодно синтаксис из валидных токенов языка, поетому если пишешь на нем то ты пишешь минимум на 2-х разных языках (привет Polkadot-у).
                Ответить
              • Ну то есть проблема обратная: В сишке стараются говно сделать максимально конфеткой (хотя конечно отсосут при попытке передать указатель на макрос, лол), а в скриптоговне вдруг внезапно что-то сделали не функцией, а конструкцией языка
                Ответить
              • А вот в языке программирования «Nim» функцию «funkcia» с аргументом «x» можно позвать тремя способами:
                funkcia (x)
                funkcia x
                x.funkcia
                Ответить
                • А вот в Kotlin есть няшные миксиняшки!
                  data class Nyashka(public val name: String)
                  
                  fun Nyashka?.nya() {
                      println("Nya")
                      this?.let(::println)
                  }
                  
                  fun main() {
                      val nya1 = Nyashka("Kawaika")
                      val nya2: Nyashka? = null
                  
                      nya1.nya()
                      nya2.nya()
                  }
                  Ответить

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

Где здесь C++, guest?!

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


    8