PHP to Node Notes (1. Расскажите о разнице между ними)

Node.js PHP

предисловие

Эта статья сериализуется и обновляется, чтобы зафиксировать мой процесс обучения и ямы, на которые я наступил, сравнитеNodeиPHPРазличия в различных сценариях, поделитесь некоторыми практическими кодами

По моей личной ситуации,LaravelПользователь является ядром толпы, и большинство кодов в этой серии находятся вNodeСпуститесь, чтобы реализовать функции традиционных серверных языков или фреймворков, таких какLaravelмаршрутов/контроллеров/промежуточного ПО/внедрения зависимостей и т. д. (см.Varal), и недавно подготовленныйLaravelизCollectionиORM

Сначала позвольте мне заявить:

  • PHP — лучший язык в мире

Это не шутка, просто когда яNodeнастоящие чувства

1. Синхронный и асинхронный

Первое и самое важное отличие — это то, которое больше всего влияет на эффективность для программистов, привыкших к синхронной разработке. в видеPHPя только что встретилNode, потому что я не понимаю "почемуNodeВ коде везде колбэки» и «почему я не могу использовать глобальные функции» уже давно, и эти две проблемы станут понятны после понимания разницы между синхронным и асинхронным.

PHPявляется синхронным (конечно, сейчас возможно и асинхронное программирование, напримерSwoole, а производительность не сравнима сNodeбедный), как правило, зависит отApacheилиNginxв видеWeb Server, каждый запрос происходитphp-fpmнезависимо от руководстваPHPВ процессе загруженные ресурсы освобождаются после завершения запроса, поэтому, будь то глобальная переменная или глобальная функция, она будет действительна только для текущего запроса.

заNodeНапример, он находится в памяти и самWeb Server, поэтому определение глобальных переменных и функций естественным образом влияет на все запросы, особенно на одновременные.

Например: существуетLaravel, используйте глобальную функциюapp()вы можете получить服务容器, через который можно получить практически всю информацию о запросе. пока вexpressсередина,appпеременная должна пройтиПерезвонипараметр передается для получения

2. Структура данных JS

① Преобразование типов

JsиPHPТакже нет необходимости объявлять типы переменных и поддерживать автоматическое преобразование, вPHP, для конкатенации строк., для добавления значений+, результат преобразования определяется по оператору, что понятно и понятно, ноJsиспользовать только+, что приводит к тому, что конечным результатом будет только строка, если в факторе есть строка.

Решение: ссылкаунарный положительный знак

+'123' // 123
1 + (+'123') // 124

② Массив

JsМассивы в не поддерживаются键值对, что приводит кPHPМногие вещи, которые вы можете делать с массивами вJsТолько объекты могут быть использованы вES6представилMapСтруктура данных, но метод построения слишком античеловеческий, и способ доступа к значениям неудобный.Думаю, в большинстве случаев использовать не просто.Массив+объект

Также стоит отметить, что мы обычно используемtypeofключевое слово, чтобы получитьJsтип данных, но数组и对象оба возвращаютсяobject, поэтому для массивов обычно используйтеArray.isArray()метод судить

3. Траверс

Объекты обычно используются для хранения键值对данные, так что нам часто нужно использовать синтаксис обхода, применимый к объектам

foo...inНа каждой итерации разныеИмя свойстваприсваивается переменной. Его не следует использовать для итерации по массиву, потому что порядок итерации зависит от контекста выполнения, поэтому обход массива не обязательно обеспечивает доступ к элементам по порядку. Он перебирает прототип объекта, поэтому иногда необходимо использоватьhasOwnProperty()для фильтрации свойств прототипа

for...ofВ каждой итерации будут разныестоимость имуществаприсваивается переменной, но требует, чтобы объект реализовывал[Symbol.iterator]метод см.for...of

Итак, для простого использования键值对объект с помощьюfor...in,заArray,MapИспользуется при ожидании встроенных объектовfor...ofэто лучший выбор

4. Нативные вспомогательные методы

Возьмите массив в качестве примера,PHPпредоставляет около 80+ методов, связанных с манипулированием массивами, в то время какJSВсего около 30+, в результате чегоPHPБудучи избалованным, я часто вздыхаю: "WTF, неужели ты вообще должен сам писать эту функцию?" Конечно, в этом есть как минусы, так и плюсы. Если вы будете уделять большое внимание качеству кода, то обязательно сравните несколько реализаций этой функции и выбрать лучший, который, хотя и займет много времени, также тренирует ваш алгоритм и мыслительные способности

5. Классы и наследование

ES6обеспечивает реализацию классов и наследования на уровне языка, но по сравнению сPHPКлассы имеют следующие отличия:

  • Интерфейс не поддерживается
  • Приватные методы не поддерживаются, решение: Переместите частные методы из класса,callспособ вызова
    class Foo {
        foo(baz) {
            bar.call(this, baz);
        }
    }
    function bar(baz) {
        return this.bar = baz;
    }
    let a = new Foo();
    a.foo(1);
    console.log(a.bar); // 1
    
  • Не поддерживает приватные свойства, есть предложения по поддержке приватных свойств и приватных методов
  • Статические свойства не поддерживаются, решение:
    class Foo {
        //
    }
    Foo.bar = 1;
    console.log(Foo.bar); // 1
    

Тем не менее, его все еще можно использовать, иES6также обеспечиваетProxyиReflectОбъект, используемый для перехвата и определения поведения основных операций по умолчанию, что эквивалентно внесению изменений на уровне языка, аналогичноPHPмагический метод, но более мощный! Через них к родному языку можно добавить еще какие-то разумные фичи

6. Экологическая среда

PHPимеютComposer,Jsимеютnpm, текущая тенденция, естественно, в том, что последний более популярен, позвольте мне рассказать вам о своих ощущениях:

  • отличается отComposerКак называется имя владельца/пакета,npmУникально только имя пакета, естественно есть такие пакеты, которые "занимают яму без говна"
  • Качество кардинального числа, естественно, снижается, и требуется больше времени, чтобы найти надежную упаковку, что субъективно вызывает у меня очень грязное ощущение.
  • Не могу до конца понять, что простая функция или даже функция может быть пакетом, а количество зависимостей так велико.
  • не могу понятьexpressПосле установки этого облегченного фреймворка папка зависимостей лучше, чемLaravelвсе еще большой

Заключение и предварительный просмотр

В общем, переключать язык разработки точно будет немного неудобно, и сейчас я это делаю спокойно.NodeЯ просто хочу записать свои настоящие чувства в то время, и слова немного враждебны. Пожалуйста, простите меня.

Следующая статья познакомит меня с использованиемNodeразвиватьWeb ServerИстория статьи, спасибо за прочтение, прошу указать на ошибки в тексте, приветствую общение