LINUX.ORG.RU

hello world на PHP

 , , ,


0

1

Слегка расширенный (показывает cl аргумент) хелловорлд:

Раз:

class System {

	public static function out(string $string) {
		$handle = fopen('php://stdout', 'w');
		fwrite($handle, $string.PHP_EOL);
		fclose($handle);
	}

	public static function argv() {
		return @$_SERVER['argv'][1] ? : '';
	}
}

class HelloWorld {

	public static function main(){
		System::out('Hello World! Your argument: '. System::argv() );
	}
}

HelloWorld::main();

И два:

function main(){
	
	function printStdOut(string $string) {

		function stream($handle, string $text) {
			$getHandle = function() use ($handle) {
				return $handle;
			};
			fwrite($getHandle(), $text."\n");
			fclose($getHandle());
		}

		stream(fopen('php://stdout', 'w'), $string);
	}

	function getArgv() {
		return @$_SERVER['argv'][1] ? : '';	
	}
	
	printStdOut('Hello World! Your argument: ' . getArgv() );
}

main();

Может перейти в обучении (скрипто-ЯП прежде всего) на такие вот первые программы-хелловолды? Ну посудите сами: что такое echo/print/etc «Hello World»? Что это за объяснение такое - языковая конструкция, которая "выводит одну или более строк" (из оф.док.)? Или просто "выводит текст" (науч.поп.)? Куда выводит, как выводит, какую строку. Ничего не понятно, пользы мало.

А если сразу начать разбирать вышеприведенные хелловолды, то вырисовывается много (весьма важных) тем для изучения начинающему программисту.

Как вариант: можно ли рассматривать написание изоморфных (указанным выше) хелловорлдов в других ЯП, как быстрый старт, в изучении этих самых ЯП опытным программистом? Насколько это будет продуктивно?

Ужас какой то...

import sys
from aiohttp import web

async def handle(request):
    name = request.match_info.get('name', "Anonymous")
    text = "Hello, " + name + str(sys.argv)
    return web.Response(text=text)

app = web.Application()
app.add_routes([web.get('/', handle),
                web.get('/{name}', handle)])

web.run_app(app)
dem ()
Последнее исправление: dem (всего исправлений: 1)

если сразу начать разбирать вышеприведенные хелловолды, то вырисовывается много (весьма важных) тем для изучения

Сначала надо изучить квантмех, иначе вообще не понятно как там электроны двигаются-двигаются, а в итоге на экране hello world.

no-such-file ★★★★★ ()

Зачем такие простые примеры? В реальных проектах же так не бывает!

У меня сохранился отличный hello world. Но, похоже, оригинальная ссылка сдохла, придётся скопипастить весь код сюда...

<?php
class HelloWorldController {
    private $model;
    function __construct($model) {
        $this->model = $model;
    }

    function handleEvent($args) {
        $this->model->setStrategy($args[2]);
        $this->model->addText($args[1]);
    }
}

class HelloWorldModel {
    private $text;
    private $observers = array();
    private $strategy;
    
    function attach($observer) {
        $this->observers[] = $observer;
    }

    function getData() {
        $facade = new HelloWorldFacade($this->strategy);
        return $facade->getHelloWorld().$this->text."\n";
    }

    function addText($text='') {
        $this->text = $text;
        $this->notify();
    }

    function setStrategy($strategy) {
        $this->strategy = $strategy;
    }
    
    function notify() {
        foreach ($this->observers as $observer) {
            $observer->update();
        }
    }
}

class HelloWorldView {
    private $model;

    function initialize($model) {
        $this->model = $model;
        $model->attach($this);
        return $this->makeController();
    }

    function makeController() {
        return new HelloWorldController($this->model);
    }

    function update() {
        $this->display();
    }

    function display() {
        echo $this->model->getData();
    }
}

/*********************************************************************
"Business logic"
********************************************************************/

class HelloWorld {
   function execute() {
       return "Hello world";
   }
}

class HelloWorldDecorator {
   private $helloworld;
   function __construct($helloworld) {
       $this->helloworld = $helloworld;
   }

   function execute() {
       return $this->helloworld->execute();
   }
}

abstract class HelloWorldEmphasisStrategy {
    abstract function emphasize($string);
}

class HelloWorldBangEmphasisStrategy extends HelloWorldEmphasisStrategy {
    function emphasize($string) {
       return $string."!";
    }
}

class HelloWorldRepetitionEmphasisStrategy extends HelloWorldEmphasisStrategy {
    function emphasize($string) {
       return $string." and ".$string." again";
    }
}

class HelloWorldEmphasizer extends HelloWorldDecorator {
   private $strategy;
   function HelloWorldEmphasizer($helloworld,$strategy) {
       $this->strategy = $strategy;
       parent::__construct($helloworld);
   }

   function execute() {
       $string = parent::execute();
       return $this->strategy->emphasize($string);
   }
}

class HelloWorldStrategyFactory {
    static function make($type) {
        if ($type == 'repetition') return self::makeRepetitionStrategy();
        return self::makeBangStrategy();
    }

    static function makeBangStrategy() {
        return new HelloWorldBangEmphasisStrategy;
    }
    static function makeRepetitionStrategy() {
        return new HelloWorldRepetitionEmphasisStrategy;
    }
}

class HelloWorldFormatter extends HelloWorldDecorator {
   function execute() {
       $string = parent::execute();
       return $string."\n";
   }
}

class HelloWorldFacade {
    private $strategy;
    function __construct($strategyType) {
        $this->strategy = HelloWorldStrategyFactory::make($strategyType);
    }

    function getHelloWorld() {
        $formatter = new HelloWorldFormatter(
                new HelloWorldEmphasizer(
                    new HelloWorld,$this->strategy));
        return $formatter->execute();
    }
}

$model = new HelloWorldModel;
$view = new HelloWorldView;
$controller = $view->initialize($model);
$controller->handleEvent($_SERVER['argv']);

?>

Тут, определённо, «много (весьма важных) тем для изучения».

pynonymous ()
Ответ на: комментарий от pynonymous

Если серьёзно, то речь же идёт о коде для начинающих? Так вот, есть два вида «начинающих» php-шников: те, кто никакого другого языка до этого не видели и вообще не умеют писать программы, и те, кто уже умеют кодить, но не на PHP.

Для вторых идеальный вариант — https://learnxinyminutes.com/docs/php/ Здесь можно познакомиться с отличиями синтаксиса. А хитрые объектные хелловорлды им не нужны, кодить они итак умеют.

А для первых нужен максимально короткий рабочий пример, от которого можно оттолкнуться. На его основе будут объясняться переменные, операции с переменными, ветвления, циклы... Объекты там понадобятся очень нескоро, и в helloworld-е они лишние.

Вышеприведенный HelloWorld MVC, в принципе, интересен. Но не для «начинающих программистов».

pynonymous ()
Ответ на: комментарий от pynonymous

Во втором варианте у ТС тоже есть излишество - вложенные функции. Наш erlang кодер спрашивал зачем я их использую. Ну и прикол @$_SERVER Что за хрень @$ Думаю пора сделать #$%@%$#_!!SERVER

dem ()
Ответ на: комментарий от dem

Тогда код нельзя будет нормально копипастить и сломается автоформатирование. Кроме того такой код станет непонятен людям привыкшим к С-подобному синтаксису, и вероятны ошибки связанные с отступами.

Кроме того нельзя будет сделать многострочные лямбды, а без них современный язык немыслим.

pawnhearts ★★★★ ()
Последнее исправление: pawnhearts (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

1)Тогда код нельзя будет нормально копипастить и сломается автоформатирование.

Почему нельзя код копипастить? Давай все в 7 битов воткнем. Или как было в макинтоше текст может быть ТОЛЬКО большими буквами...

2)Кроме того такой код станет непонятен людям привыкшим к С-подобному синтаксису, и вероятны ошибки связанные с отступами.

А давай поспорим, что людей привыкших к С синтаксису меньше чем людей привыкших к материковому китайскому. Более того тот же Rust может быть непонятен человеку привыкшему к С синтаксису (а уж с С++ и подавно)

dem ()
Последнее исправление: dem (всего исправлений: 1)
Ответ на: комментарий от dem
<?php\nclass HelloWorldController {\n  private $model;\n  function __construct($model) {\n    $this->model = $model;\n  }\n\n  function handleEvent($args) {\n    $this->model->setStrategy($args[2]);\n    $this->model->addText($args[1]);\n  }\n}\n\nclass HelloWorldModel {\n  private $text;\n  private $observers = array();\n  private $strategy;\n  \n  function attach($observer) {\n    $this->observers[] = $observer;\n  }\n\n  function getData() {\n    $facade = new HelloWorldFacade($this->strategy);\n    return $facade->getHelloWorld().$this->text."\n";\n  }\n\n  function addText($text=\'\') {\n    $this->text = $text;\n    $this->notify();\n  }\n\n  function setStrategy($strategy) {\n    $this->strategy = $strategy;\n  }\n  \n  function notify() {\n    foreach ($this->observers as $observer) {\n      $observer->update();\n    }\n  }\n}\n\nclass HelloWorldView {\n  private $model;\n\n  function initialize($model) {\n    $this->model = $model;\n    $model->attach($this);\n    return $this->makeController();\n  }\n\n  function makeController() {\n    return new HelloWorldController($this->model);\n  }\n\n  function update() {\n    $this->display();\n  }\n\n  function display() {\n    echo $this->model->getData();\n  }\n}\n\n/*********************************************************************\n"Business logic"\n********************************************************************/\n\nclass HelloWorld {\n  function execute() {\n    return "Hello world";\n  }\n}\n\nclass HelloWorldDecorator {\n  private $helloworld;\n  function __construct($helloworld) {\n    $this->helloworld = $helloworld;\n  }\n\n  function execute() {\n    return $this->helloworld->execute();\n  }\n}\n\nabstract class HelloWorldEmphasisStrategy {\n  abstract function emphasize($string);\n}\n\nclass HelloWorldBangEmphasisStrategy extends HelloWorldEmphasisStrategy {\n  function emphasize($string) {\n    return $string."!";\n  }\n}\n\nclass HelloWorldRepetitionEmphasisStrategy extends HelloWorldEmphasisStrategy {\n  function emphasize($string) {\n    return $string." and ".$string." again";\n  }\n}\n\nclass HelloWorldEmphasizer extends HelloWorldDecorator {\n  private $strategy;\n  function HelloWorldEmphasizer($helloworld,$strategy) {\n    $this->strategy = $strategy;\n    parent::__construct($helloworld);\n  }\n\n  function execute() {\n    $string = parent::execute();\n    return $this->strategy->emphasize($string);\n  }\n}\n\nclass HelloWorldStrategyFactory {\n  static function make($type) {\n    if ($type == \'repetition\') return self::makeRepetitionStrategy();\n    return self::makeBangStrategy();\n  }\n\n  static function makeBangStrategy() {\n    return new HelloWorldBangEmphasisStrategy;\n  }\n  static function makeRepetitionStrategy() {\n    return new HelloWorldRepetitionEmphasisStrategy;\n  }\n}\n\nclass HelloWorldFormatter extends HelloWorldDecorator {\n  function execute() {\n    $string = parent::execute();\n    return $string."\n";\n  }\n}\n\nclass HelloWorldFacade {\n  private $strategy;\n  function __construct($strategyType) {\n    $this->strategy = HelloWorldStrategyFactory::make($strategyType);\n  }\n\n  function getHelloWorld() {\n    $formatter = new HelloWorldFormatter(\n        new HelloWorldEmphasizer(\n          new HelloWorld,$this->strategy));\n    return $formatter->execute();\n  }\n}\n\n$model = new HelloWorldModel;\n$view = new HelloWorldView;\n$controller = $view->initialize($model);\n$controller->handleEvent($_SERVER[\'argv\']);\n\n?>\n
dem ()
    • Для пыхарей есть специальный загончик: Пыхотред
    • Ты пытаешься писать на пыхе как 1) на жабе, 2) на перле. У пыха есть свой аутентичный стиль, его надо понимать.
  • Для обучения программированию надо не хелловорлды писать, а читать SICP. Дальше все языки становятся как на ладони, а синтаксис просто смотришь в документации и на SO
lovesan ()

Я хоть и pynonymous'а не люблю, но он дело говорит. Пых надо начинать изучать с метапограммирования и рефлексии, т.к. в пыхе рулят и педалят фреймворки, а там все эти твои @$_SERVER никуда не всрасиль.

crutch_master ★★★★★ ()
Ответ на: комментарий от dem

В пыхе особого смысла нет, а в том же js это сплошь и рядом ибо ускоряет загрузку.

Почему нельзя код копипастить?

Почему ты задаёшь вопросы, на которые не хочешь слышать ответы? Всё уже обсосано по 10 раз.

no-such-file ★★★★★ ()

Как вариант: можно ли рассматривать написание изоморфных (указанным выше) хелловорлдов в других ЯП, как быстрый старт, в изучении этих самых ЯП опытным программистом? Насколько это будет продуктивно?

Не знаю, можно ли это использовать в обучении... Ну не говнокодить же мы хотим научить? Это больше похоже на экзаменационные тесты: «взгляните на этот код и скажите, что в нём означает конструкция вида:»

  $getHandle = function() use ($handle) { ... };
или «объясните, почему в этом коде использовано @$_SERVER['argv'][1] вместо $_SERVER['argv'][1]», или «что такое $string.PHP_EOL», и т.д.

Для обучения это годилось бы не в виде хелловорлда, а как часть общего руководства, где в одном месте объясняются все подобные элементы синтаксиса с примерами. Но тогда мы, опять-таки, получим https://learnxinyminutes.com/docs/php/

Кстати, похоже, собачка на learnxinyminutes не объясняется. Предлагаю отправить пулл-реквест!

pynonymous ()
Ответ на: комментарий от lovesan

аутентичный стиль PHP

Для пыхарей есть специальный загончик: Пыхотред

Сабж не про PHP.

У пыха есть свой аутентичный стиль, его надо понимать.

Где посмотреть этот эталонный аутентичный стиль?

Edward_I ()
Ответ на: комментарий от lovesan

Для обучения программированию надо не хелловорлды писать, а читать SICP.

1. но помимо чтения, писать-то что-то нужно? или это уже необязательно?

2. в ОП было два вопроса. во втором не про обучение программированию, а про изучение новых ЯП.

Edward_I ()
Ответ на: комментарий от dem

Че там уже Светлов запилил в aiohttp авторелоад приложения после правок в коде или постаринки перезапускаете сервер по 100500 раз на дню ручками? Все трушные фреёмворки уже могут это давно

NetSurf ()