¡GoConqr estrena diseño! Cuéntanos qué te parece.

Apuntes

PHP - Escopo e Visibilidade - Notas

Vinícius Rezendrix PHP Portugués 3 páginas

Contenido del apunte (3)

Página 1

Escopo e Visibilidade

Escopo é o limite da existência, da necessidade, da utilidade, do objetivo, da função a que se presta, do papel a ser desempenhado por:

uma $variável;

por uma função()[sinônimo de método()];

por um parâmetro;

por uma Classe.

O Escopo pode ser dividido de acordo com os limites de existência da variável em:

Escopo Global - Variável disponível em todo código do programa;

Escopo de Namespace - pesquisar melhor - diz respeito a Classes, mas as abarca;

Escopo de Classe - Limite dentro do qual estão disponíveis variáveis e funções de uma Classe;

Public;

Protected;

Private;

Escopo de Função - Variável disponível dentro de uma função somente;

Escopo de Parâmetro - Parâmetro disponível dentro de uma função;

Escopo de Bloco - Variável disponível dentro de um bloco condicional if/else; de um bloco de loop for($i=0;$i<10;i++).

Na programação Orientada a Objetos o Escopo pode se confundir com a visibilidade de um conjunto de variáveis ou funções.

Tempo de Vida

Relevante para entender-se o escopo é o conceito de Tempo de Vida. Este é um conceito de tempo de execução. Pode estar relacionado à variáveis, mas também a objetos em geral. Se refere ao armazenamento de dados.

Se for uma variável o tempo de vida se refere ao tempo que ela está disponível para acesso, ou pelo menos quando ela tem um valor com significado para o código. Em algumas situações é igual ao escopo.

É importante diferenciar variável, que é só o nome dado a um valor, conforme já definido, e do valor a que ela se refere. O tempo de vida tem mais a ver com o valor. Um valor pode sobreviver mesmo que a variável morra.

Sobrevive quando:

o valor é retornado no fim de uma função

o valor é atribuído para outra variável em escopo maior (pode ser outra estrutura de dados)

o valor é atribuído dentro de uma closure ou mecanismo com efeito semelhante

Há o tempo de vida do valor da variável, que pode ser apenas uma referência e tem o tempo de vida do objeto a que ela se refere.

Em geral, quando uma variável sai de escopo, se seu valor (mesmo referenciado) não estiver vinculado à nada, seu tempo de vida acaba, ou pelo menos torna-se inacessível. Mas há casos em que o objeto passa para outro proprietário, mantendo seu tempo de vida.

Página 2

STATIC, CONST E SOBRECARGA

Static - Declarar propriedades ou métodos de uma classe como estáticos faz deles acessíveis sem a necessidade de instanciar a classe.

Uma variável estática é visível num escopo local, mas ela é inicializada apenas uma vez e assim seu valor não é perdido quando a execução do código termina o escopo.

function testeEstatico(){

$x=0;

echo $x;

$x++; // Esse comando não tem utilidade pois, cada vez que a função é chamada, a variável $x é novamente inicializada e tem seu valor reatribuído para 0

}

function testeEstatico(){

static $x = 0;

echo $x;

$x++; // com o uso do modificador Static a variável $x é inicializada somente uma vez e seu valor é mantido, incrementando-se a cada execução da função

}

O modificador static é utilizado principalmente em funções recursivas nas quais o valor das variáveis precisa ser mantido. O valor das variáveis são mantidos após o término da execução da função. Quando a função é novamente executada, o valor já inicializado da variável estática é recuperado.

Dica: Uma ótima ideia de aplicação prática é colocar todas as utility functions em uma Classe e as transformar em estáticas.

Utility functions são, por exemplo, aquelas usadas para tratar caracteres em uma string, alterar a codificação utf8, sanitizar, filtrar, validar, escapar inputs.

class Utility {

public static function utility_a() { }

public static function utility_b() { }

public static function utility_c() { }

}

//and call them as

$a = Utility::utility_a();

$b = Utility::utility_b();

Operador de Resolução de Escopo

Para acessar funções ou propriedades estáticas, constantes e sobrecarregadas de uma classe, utiliza-se o Operador de Resolução de Escopo, ou, dois pontos duplo (::).

Três palavras-chave especiais self, parent e static, são utilizadas para acessar propriedades e métodos dentro de uma definição de classe.

self equivale ao $this->

parent é usado para acessar uma propriedade da Classe Pai pela Classe Filha

class MyClass {

const constanteFelino= 'Gato';

}

class OtherClass extends MyClass {

public static $estaticaCanideo= 'Cachorro';

public static function doubleColon() {

echo parent::constanteFelino. "\n";

echo self::$estaticaCanideo. "\n";

}

}

$classname = 'OtherClass';

echo $classname::doubleColon(); //É o mesmo que abaixo

//imprimirá:

// Gato \n

// Cachorro \n

OtherClass::doubleColon(); //É o mesmo que acima

//imprimirá:

// Gato \n

// Cachorro \n

Página 3

Namespace

Namespaces

In the times before namespaces, PHP put every variable, function and class under the global namespace. This limited developers to ensure that their applications only had unique function and class names. Developers got round this issue by prefixing class and function names to provide a pseudo effect of namespaces, but the problem with this was that class names could end up being huge, making it sometime hard to read and write them without the use of an intelligent IDE.

Thankfully, with the introduction of namespaces, this problem was resolved. By using the namespace keyword followed by the namespace name at the top of a PHP file, it puts all the code below into that reflective namespace that cannot be accessed by any other namespaces unless explicitly instructed to. With the use of namespaces, we are now able to create well-structured and readable code that's easier to read and manage.

The example below shows how we can implement our own myNamespace namespace and create a new DateTime Class that is completely independent from the standard one provided in the global namespace. Notably, we are able to still use the default standard DateTime class in the namespace by adding a backslash to the front of the name when creating a new instance.

<?php

namespace myNamespace;

class DateTime{

public function customMethod(){

return 'Fun Times'; }

}/* * Create a new DateTime object that's in this current namespace

* If we are outside this namespace we can create it by:

* $customDate = new \myNamespace\DateTime();

*/$customDate = new DateTime();

echo $customDate->customMethod();

/* We can still create the default DateTime object */

$standardDate = new \DateTime();

echo $standardDate->format('Y-m-d H:i:s');

Información

Descripción
Conceituação; Tipos e Visibilidade
Creado por
Vinícius Rezendrix · oct 2019
Actualizado
19 oct 2019
Visitas
4
Valoración

Escríbenos

¿Sobre qué es tu mensaje?

¿Qué te parece el nuevo diseño?

¿Te gusta?