Normalmente, artigos desse tipo fornecem respostas completas a perguntas, mas se você está entrevistando para uma posição bastante séria, um breve resumo obviamente não será suficiente e você precisa entender a pergunta em si de forma bastante profunda, então, eu principalmente inseri links para documentação ou artigos sobre os problemas descritos.
PHP
- O que há de novo no PHP 7. *
- Tipos de dados
- Digite hinting + modo estrito
- Comparação forte versus fraca
- Trabalhando com links
- Copy-on-write
- Tratamento de erros em tempo de execução
- Fechamentos
- Funções de array
- list()
- //
- Final
- Reflection API
- Autoloader
- SPL
- APC/APCu
- OPcache
- PSR standards
- Composer
- XDebug
- Rest API
OOP
Databases
Docker
HTTP
JS
PHP
PHP 7.*
Eh, eu me lembro dos momentos em que eu estava contando a diferença entre as versões 4 e 5, nunca vendo a 4ª nos meus olhos, velhas tradições devem ser observadas, a pergunta ocorre em quase todas as entrevistas, e embora ninguém espere que você se lembre literalmente em qual versão qual ocorreram mudanças, em geral, vale a pena conhecer essas informações:
- Novo no php 7.0 ( habr / documentação )
- Novo no php 7.1 ( habr / documentação )
- Novo no php 7.2 ( habr / documentação )
- Novo no php 7.3 ( habr / documentação )
- Novo no php 7.4 ( habr / documentação )
- E desde que começamos, novo no php 8.0 habr
Tipos de dados
Embora o PHP seja uma linguagem dinâmica, todos os dados nele contidos são de tipos distintos:
Tipos escalares:
- bool
- int
- float (às vezes o nome double é usado, o que para php não faz diferença)
- corda
Tipos mistos:
- matriz
- objeto
- exigível
- iterável
Tipos especiais:
- recurso
- nulo
Leia mais sobre tipos e pseudo-tipos na documentação .
Digite hinting + modo estrito
Como uma continuação lógica do tópico de tipos e digitação forte que veio com o php 7. *, você precisa saber sobre a diferença entre digitação forte e frouxa, consulte a documentação para obter detalhes .
Comparação forte versus fraca
Você precisa entender a diferença entre comparação livre (comparação de valores sem levar em conta o tipo de dados) e comparação estrita (levando em consideração o tipo de dados), que esta tabela reflete muito bem . Devemos também destacar a comparação estrita e livre de objetos .
Trabalhando com links
Referências em PHP são basicamente uma forma de acessar a mesma variável (área de memória) com nomes diferentes.
As principais operações que podem ser realizadas com links:
É importante compreender as especificidades da passagem de objetos. Você pode ler que no php todos os objetos são passados por referência.Isso
era verdade antes do php5, mas agora apenas o identificador do objeto é passado ( documentação ).
Em suma, se você criou um objeto e o passou para uma função, dentro da qual você
$object = null;isso não significa que o objeto original também será zerado, você ainda pode trabalhar com ele. Mas se você passou explicitamente um objeto por referência, então esta ação irá “zerar” o objeto original também.
Copy-on-write
Cada vez que uma variável é passada para uma função, seu valor (teoricamente) deve ser copiado. Isso pode não ser um problema para dados inteiros ou flutuantes, mas imagine que você está passando um array contendo dez milhões de valores para uma função. Para evitar isso, o PHP usa o paradigma copy-on-write. Então, de fato, quando você transfere um array, sua cópia não ocorre até o momento em que você não deseja alterar nada neste array. Um artigo com uma explicação mais detalhada.
Tratamento de erros em tempo de execução
Na 7ª versão do php houve uma série de mudanças que se relacionam com a hierarquia de erros (mais informações sobre a hierarquia ), caso contrário, espera-se que o requerente saiba como capturar exceções , ou mesmo ser capaz de escrever seu próprio error_handler .
Fechamentos
Eles também são funções anônimas, mais úteis como valores para parâmetros de retorno de chamada, documentação . Existe um artigo bom, embora um pouco antigo, sobre como trabalhar com tampas em Habré .
Funções de array
Frequentemente solicitado a nomear todas as funções para trabalhar com matrizes que você lembra de memória. E embora, na minha opinião, esta questão seja um pouco mais do que sem sentido, a lista de funções pode ser repetida a partir da documentação .
Função List ()
Graças às mudanças no PHP 7.1, a função se tornou mais conveniente de usar, como resultado, ela é usada com mais frequência, todas as informações podem ser encontradas na documentação .
Escopo variável
Na maioria dos casos, todas as variáveis têm apenas um escopo , com exceção de globais / superglobais, que, como o nome indica, estão disponíveis em todos os lugares, bem como estáticas / constantes.
Escopo de uma constante de propriedade / método / classe
É definido usando as palavras-chave public (visível para todos), protected (disponível apenas para a classe atual ou seus descendentes) ou private (disponível apenas para a classe atual), e pode ser usado tanto para propriedades / métodos, quanto desde o PHP 7.1 para constantes de classe. Leia mais na documentação .
Aulas e métodos finais
Colocando a palavra-chave final na frente das declarações de método de classe, você pode evitar que elas sejam sobrescritas em classes filhas e, se a própria classe for declarada final, ela não pode ser herdada. Essas classes e métodos são projetados para proteger códigos confidenciais de alterações, e o próprio código se torna mais fácil de manter.
Leia mais na documentação .
Vinculação estática tardia
Expresso como a diferença entre chamar self :: e static ::. "Late binding" significa que static :: será avaliado em tempo de execução e pode ser redefinido em classes derivadas. Leia mais na documentação .
Métodos mágicos
No PHP, não há absolutamente lugar nenhum sem mágica, então temos métodos que nos permitem implementar funcionalidade adicional para um objeto, substituir o comportamento padrão de um objeto (por exemplo, __serialize () / __ unserialize ()), ou o comportamento de um objeto em situações atípicas (__toString ()) e outras.
Documentação e um bom artigo, embora um pouco desatualizado, sobre Habré .
Variáveis dinâmicas
Você pode passar o nome de uma variável para outra e então usar essa variável “dinamicamente”.
Eles devem ser usados com muito cuidado, pois podem complicar significativamente a leitura e a manutenção do código (muitas vezes é impossível entender o que está em uma variável sem executar o código), mas podem ser muito úteis em abstrações. Leia mais na documentação .
Geradores
Geradores (palavra-chave de rendimento) criam iteradores simples para economizar memória em situações em que você precisa iterar em uma grande quantidade de dados. Eles podem ser um pouco difíceis de entender antes de você escrever seu gerador.
A descrição está na documentação , e há uma bastante antiga (porém, a sintaxe dos geradores não mudou desde aquele momento) e um bom artigo sobre Habré .
API de reflexão
Resumindo, é a capacidade de olhar dentro do seu próprio código (ou de outra pessoa), descobrir quais variáveis, métodos, constantes uma classe possui e torná-los públicos, se desejado. Essa capacidade é usada ativamente por estruturas (por exemplo, em uma sinfonia para geração automática de injeção de dependência) e bibliotecas. Descrição na documentação e, claro, um artigo sobre Habré .
Autoloader
Normalmente, em projetos, muito raramente é necessário implementar autoload de classes por conta própria, mas para empresas que escrevem todas as soluções por conta própria (por exemplo, grandes corporações que não querem trabalhar com código aberto), ou para alguns projetos especiais, isso é relevante. Também pode ser útil entender como funciona.
- github.com/codedokode/pasta/blob/master/php/autoload.md
- www.php.net/manual/ru/function.spl-autoload-register.php
- www.php.net/manual/ru/language.oop5.autoload.php
SPL
Ou Standart PHP Library - um conjunto de classes (estruturas de dados, iteradores, exceções, classes para processamento de arquivos), interfaces e funções para resolver problemas padrão. Via de regra, não é necessário saber de cor a biblioteca, mas entender em que ela consiste vale pelo menos para o desenvolvimento pessoal. Mais detalhes na documentação - www.php.net/manual/ru/book.spl.php
APC / APCu
Cache PHP alternativo (APC) ou cache alternativo sem opcode (APCu) é um cache de código aberto gratuito projetado para armazenar em cache e otimizar o código intermediário de PHP. É usado principalmente para manter cálculos entre solicitações. Documentação:
OPcache
Melhora o desempenho do PHP, armazenando o bytecode do script compilado na memória compartilhada, eliminando assim a necessidade do PHP carregar e analisar scripts em cada solicitação. Documentação oficial , bem como um artigo muito bom sobre como tudo funciona no Habré .
Padrões PSR
Recomendações de padrões PHP - padrões para codificação, bem como interfaces para tarefas comuns. Esses padrões são usados em todas as estruturas (conhecidas por mim) e facilitam as interações entre diferentes bibliotecas. Documentação oficial e também um bom artigo sobre Habré .
Compositor
Gerenciador de dependências , bem como uma ferramenta que implementa o carregamento automático do código da biblioteca e do próprio aplicativo. Pode ajudar a otimizar e acelerar seu aplicativo de produção.
XDebug
A maioria dos desenvolvedores usa essa extensão para facilitar o trabalho com o código ou para otimizá-lo. O conhecimento básico aqui é como configurá-lo e executá-lo. O seguinte artigo blog.denisbondar.com/post/phpstorm_docker_xdebug ajudará nisso .
API Rest
O REpresentational State Transfer é uma abordagem arquitetônica que permite organizar a interação entre os aplicativos usando todos os recursos do HTTP. Bom artigo sobre esse tópico e também as diferenças entre REST e SOAP .
No contexto de uma API, você precisa entender os formatos básicos de troca de dados, geralmente XML e JSON .
Testes
Todos os testes unitários são baseados em PHPUnit (até onde eu sei), e hoje, poder e saber escrever testes é uma parte obrigatória do desenvolvimento. Muitos frameworks (como Symfony) oferecem seus próprios invólucros e soluções de teste. Aqui está um bom artigo sobre as melhores ferramentas de teste .
OOP
Encapsulamento / herança / polimorfismo
- . , , , . , . .. . ( ) . , , .
- . , , , .
- Polimorfismo . Esta é uma propriedade que permite que o mesmo nome seja utilizado para resolver diversos problemas tecnicamente distintos. Em termos simples, o conceito de polimorfismo é a ideia de “uma interface, muitas implementações”. Isso significa que você pode criar uma interface comum para um grupo de ações relacionadas.
Classes / métodos abstratos
- Não envolve instanciação.
- Eles implementam na prática um dos princípios da OOP - polimorfismo.
- Pode conter métodos abstratos e propriedades. Um método abstrato não é implementado para a classe em que é descrito, mas deve ser implementado para seus descendentes não abstratos.
- Eles representam as abstrações mais gerais, ou seja, têm o maior volume e o menor conteúdo.
Nuances de implementação na documentação .
Interfaces
Uma interface, ao contrário de uma classe abstrata, não pode conter campos e métodos que tenham uma implementação - ela apenas descreve as assinaturas de método que seus herdeiros devem implementar. Ao contrário da mesma classe abstrata, uma classe pode implementar várias interfaces simultaneamente. Documentação
oficial e um bom artigo sobre Habré .
Traços
A característica é muito semelhante a uma classe, mas destina-se ao agrupamento de funcionalidades e sua posterior reutilização em um conjunto de classes que não podem ser vinculadas por uma classe abstrata. Também é dito às vezes que uma característica é uma forma de implementar herança múltipla em PHP.
Uma vez que cada classe pode implementar muitas características, conflitos podem surgir quando o mesmo método é implementado em características diferentes e / ou na própria classe. Leia mais sobre as características na documentação .
Modelos GRASP
Padrões de software de atribuição de responsabilidade geral - padrões de projeto para resolver problemas comuns. Ao contrário dos padrões da Gangue dos Quatro, os padrões GRAPS não têm uma estrutura pronunciada, um escopo claro e um problema específico a ser resolvido, mas apenas representam abordagens / recomendações / princípios generalizados usados no projeto do projeto do sistema.
Bom artigo sobre o assunto - habr.com/ru/post/92570
Gangue de quatro padrões
O tópico de padrões é vasto, muitos artigos já foram escritos sobre ele e é simplesmente impossível tentar descrevê-lo em algumas frases. Eu gosto deste recurso - refactoring.guru/ru/design-patterns/catalog , mas você pode usar este link se necessário .
SÓLIDO
Todo mundo pergunta a ele, mas eles perguntam de forma diferente.
Opção ruim - você é solicitado a ler os princípios e suas definições de memória.
Bom - eles lhe dizem um princípio e pedem que você o explique, descreva exemplos de uso, crie uma situação real em que este ou aquele princípio ajudará de alguma forma. Essa opção, na minha opinião, torna muito melhor entender o nível do candidato e sua real compreensão dos princípios.
No Habré você pode encontrar dezenas de artigos realmente bons sobre esses princípios, então eu faço um link para o meio .
Beijo
Mantenha-o simples, estúpido é um bom princípio, cujo ponto todo já está contido no título, você pode aprender mais aqui .
Seco
Não se repita - o princípio de que você deve reutilizar seu código sempre que possível. Mais detalhes aqui .
Bancos de dados
Um bom artigo sobre bancos de dados SQL pode ser encontrado aqui . Perguntas sobre bancos de dados NoSql no meu caso geralmente são encontradas no exemplo do MongoDB . No caso do ElasticSearch, geralmente são utilizadas bibliotecas de wrapper, informações gerais podem ser encontradas no artigo sobre Habré .
Nos armazenamentos de memória (aqueles que armazenam valores na RAM) são memcached e / ou redis (na maioria das vezes), via de regra, o trabalho com eles é feito por meio de bibliotecas de invólucros, se quiser entender o assunto com mais detalhes, é claro que há um artigo sobre Habré .
Docker
Uma ferramenta muito importante que tem sido usada em quase todos os projetos (no meu caso). E embora seja frequentemente configurado uma vez por projeto, você precisa conhecer os conceitos básicos e o princípio de como trabalhar com ele. Pessoalmente, adoro este artigo para uma entrevista de emprego .
HTTP e outros protocolos
Obviamente, qualquer desenvolvedor da Web deve saber e compreender como funcionam os protocolos de transferência de dados (pelo menos os protocolos de nível superior). O assunto é extenso e é difícil encaixá-lo em várias frases, há um extenso artigo sobre o assunto no Habré .
Autorização e autenticação
Autorização é a concessão de direitos para realizar determinadas ações, bem como o processo de verificação de direitos ao tentar realizar essas ações.
A autenticação é um procedimento de autenticação, como verificar a identidade de um usuário comparando a senha inserida por ele.
É importante entender a diferença entre autorização e autenticação , como elas são implementadas usando sessão e cookies , JSON Web Tokens ( JWT ), etc.
Js
Eu realmente não conheço essa linguagem, então eu nunca pretendo estar em posições onde você precisa conhecer frameworks js e ser full-stack, talvez seja por isso que para todas as entrevistas havia conhecimento suficiente descrito no artigo - habr.com/ru/post/486820