// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Tutorial para Início Rápido em PHP do NetBeans IDE
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Tutorial para Início Rápido em PHP do NetBeans IDE - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Tutorial para Início Rápido em PHP do NetBeans IDE

Este documento oferece orientações gerais para preparar o ambiente de desenvolvimento do PHP, configurar um projeto PHP e desenvolver e executar a sua primeira aplicação PHP no NetBeans IDE para PHP.

*Para seguir este tutorial, são necessários os recursos e o software a seguir.*

|===
|Software ou Recurso |Versão Necessária 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |Pacote de download do PHP 

|Um mecanismo PHP |Versão 5 

|Um servidor web |É recomendado o link:http://httpd.apache.org/download.cgi[+Apache HTTP Server 2.2+].
 

|Um depurador PHP |link:http://www.xdebug.org[+XDebug 2.0 ou superior+] 
|===

Você pode instalar o mecanismo PHP, o servidor Web e o banco de dados separadamente ou utilizar os pacotes AMP (*A*pache, *M*ySQL e *P*HP).


== Instalação e Configuração

Os documentos a seguir contêm instruções para uma das duas formas de configurar uma pilha Web de PHP no seu sistema operacional. Essas instruções não são definitivas. A pilha Web consiste no software de terceiros, seu ambiente pode ser diferente e talvez você tenha preferência por outro pacote AMP ou outra forma de configurar o PHP. Você pode precisar completar nossas instruções com suas próprias investigações.

* link:configure-php-environment-windows.html[+Configurando o Ambiente de Desenvolvimento de PHP no Windows+]
* link:configure-php-environment-ubuntu.html[+Configurando o Ambiente de Desenvolvimento de PHP para Distribuição Ubuntu Linux+]
* link:configure-php-environment-mac-os.html[+Configurando o Ambiente de Desenvolvimento de PHP no Sistema Operacional Mac (Mac OS X)+]


== Configurando um Projeto PHP no NetBeans IDE para PHP

Para obter ajuda para instalar e iniciar o NetBeans IDE, consulte a link:https://netbeans.org/community/releases/73/install.html[+documentação de instalação+].

Para iniciar o desenvolvimento de PHP no NetBeans IDE para PHP, é necessário, primeiro, criar o projeto. Um projeto contém as informações sobre o local dos arquivos do projeto e a forma como você deseja executar e depurar sua aplicação (executar configuração).

1. Inicie o IDE, alterne para a janela Projetos e selecione Arquivo > Novo projeto. O painel Escolher Projeto será aberto
2. Na lista Categorias, selecione PHP.
3. Na área Projetos, selecione Aplicação PHP e clique em Próximo. O painel Novo Projeto PHP > Nome e Localização será aberto. 

image::images/new-project-name-location.png[title="Painel Nome e Localização do assistente Novo Projeto PHP, com localização da Pasta de Código-fonte como raiz de documento XAmpp"]



. No campo de texto Nome do Projeto, digite  ``NewPHPProject`` .


. No campo Pasta de Códigos-fonte, procure a raiz do seu documento PHP e crie uma subpasta denominada  ``NewPHPProject`` . A raiz do documento é a pasta em que o servidor Web procura por arquivos a serem abertos no browser. A raiz do documento é especificada no link:../../trails/php.html#configuration[+arquivo de configuração+] do servidor Web. Por exemplo, no Xampp, a raiz do documento é XAMPP_HOME/htdocs.


. Deixe todos os outros campos com seus valores default. Clique em Próximo. O painel Configuração de Execução será aberto. 

image::images/new-project-run-config.png[]



. Na lista drop-down Executar Como, selecione Web Site Local. O projeto será executado no servidor Apache local. As outras opções são executar o projeto remotamente via FTP e executá-lo da linha de comandos.


. Deixe o URL do projeto com o valor default.


. Clique em Finalizar. O IDE criará o projeto.

Saiba mais sobre link:project-setup.html[+Configurando um projeto PHP no NetBeans+].


== Executando Seu Primeiro Projeto PHP

1. Inicie o IDE, selecione Arquivo > Abrir Projeto. A caixa de diálogo Abrir Projeto será aberta.
2. Selecione  ``NewPHPProject``  e clique em Abrir Projeto. A árvore NewPHPProject será exibida na janela Projetos e o arquivo  ``index.php``  do projeto será aberto no editor e na janela Navegador. 

image::images/getting-started-open-new-project.png[]



. Digite o seguinte código no bloco  ``<?php ?>`` :

[source,php]
----

 echo "Hello, world! This is my first PHP project!";
----


. Para executar o projeto, posicione o cursor no nó NewPHPProject e selecione Executar no menu de contexto. A ilustração abaixo mostra o que deveria ser exibido na janela do browser:

image::images/getting-started-browser-hello-world.png[]

Parabéns! Seu programa funciona!


== Utilizando Servidores de Banco de Dados com NetBeans IDE para PHP

Você pode utilizar vários servidores de banco de dados com o NetBeans IDE para PHP, embora o mais popular seja o servidor MySQL. Os downloads estão disponíveis link:http://dev.mysql.com/downloads/mysql/5.1.html[+aqui+]. 

NOTE:  a versão recomendada do produto é MySQL Server 5.0.

Consulte também:

* link:../ide/install-and-configure-mysql-server.html[+Configurando o Servidor de Banco de Dados MySQL no Sistema Operacional Windows+]
* link:wish-list-lesson1.html[+Criando um Banco de Dados de Amostra com Dados de Teste+]
* link:../../articles/mysql.html[+MySQL e o NetBeans IDE+]
* link:../ide/mysql.html[+Conectando se a um Banco de Dados MySQL+] 


== Próximas Etapas

Nesse meio tempo, para localizar informações específicas do tipo de aplicação que você está desenvolvendo, utilize a trilha do aprendizado do NetBeans IDE para esse tipo de aplicação. Cada trilha do aprendizado contém uma série de tutoriais e guias que variam em escopo do básico ao avançado. As seguintes trilhas do aprendizado estão disponíveis:

|===
|* link:../../trails/php.html[+Programação em PHP+]
* link:../../trails/java-se.html[+Programação Básica em Java+]
* link:../../trails/matisse.html[+Aplicações de GUI do Java+]
* link:../../trails/web.html[+Aplicações de Web Services+]
* link:../../trails/java-ee.html[+Aplicações Java EE e Java Web+]
 |

* link:../../trails/mobility.html[+Aplicações Móveis+]
* link:../../trails/platform.html[+Plug-ins e Aplicações Clientes Ricas do NetBeans+]
* link:../../trails/cnd.html[+Aplicações C/C+++]
 
|===


link:/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Quickstart[+Enviar Feedback neste Tutorial+]


Para enviar comentários e sugestões, obter suporte e manter-se informado sobre os desenvolvimentos mais recentes das funcionalidades de desenvolvimento PHP do NetBeans IDE, link:../../../community/lists/top.html[+junte-se à lista de correspondência users@php.netbeans.org+].

