// 
//     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.
//

= Renomear a Refatoração e Outros Aprimoramentos do Editor no NetBeans IDE 7.0 para PHP
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Renomear a Refatoração e Outros Aprimoramentos do Editor no NetBeans IDE 7.0 para PHP - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Renomear a Refatoração e Outros Aprimoramentos do Editor no NetBeans IDE 7.0 para PHP

|===
|Este screencast mostra as novas funcionalidades do editor PHP 7.0 NetBeans.

* *Renomear Refatoração* Você pode renomear um elemento, como um nome de classe, em todos os arquivos de um projeto. A funcionalidade força você a exibir suas alterações antes de poder fazê-las. A janela de visualização mostra cada localização do elemento e permite deletar ocorrências individuais do elemento sendo renomeado. Renomear Refatoração é comparado com a antiga funcionalidade, Renomeação Instantânea, que permite apenas renomear um elemento dentro de um arquivo e não fornece uma janela de visualização.
* *View de Hierarquia do Tipo* Exibe todos os super tipos e os subtipos de uma classe PHP, incluindo interfaces e classes que implementem uma interface.
* *Quebra de Linha* É possível configurar o Editor para quebrar linhas.
* *Exibir caracteres não imprimíveis* É possível exibir e ocultar caracteres não imprimíveis no Editor.

Autor: Jeff Rubinoff
Hora: 8:47 
link:http://bits.netbeans.org/media/rename-refactoring.flv[+Download+] [18.3 MB]

link:/about/contact_form.html?to=3&subject=Feedback: PHP Rename Refactoring Screencast[+Enviar Feedback neste Tutorial+]
 |   
|===
