• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

nunos

Scope de variaveis de confiuração

22 mensagens neste tópico

Hey! Estou aqui a fazer umas brincadeiras com php só que não estou a ver como dar a volta a isto. Como não percebo nada de php, achei melhor perguntar a quem sabe ;).

config.php:

$HOST_NAME = "localhost";
$DB_NAME   = "exp1";
$DB_USER   = "root";
$DB_PASS   = "";

index.php

require_once("config.php");

echo "HOST_NAME: " . $HOST_NAME;

function foo()
{
     echo "HOST_NAME: " . $HOST_NAME;
}

foo();

A primeira intrucao, "echo "HOST_NAME: " . $HOST_NAME;" não dá erro.

Por outro lado, quando a funcao foo() é chamada, dá um erro a dizer que a variavel $HOST_NAME nao está definida.

Eu gostava que todas as variaveis que estao no ficheiro config.php podessem ser acedidas mesmo quando estao dentro de funcoes.

P.S. Outra coisa, no C++ existe o "const" para guarantir que nao pode haver alteracoes as variaveis. Em php há algo semelhante? É que se houvesse, acho que fazia todo o sentido ter isso no ficheiro config.

Obrigado!

Cumps  :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exactamente aonde eu fui descobrir a resposta pouco depois de ter criado o tópico.

Desculpem lá.  :-[

Para a próxima procuro melhor antes de vir aqui.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já me esquecia. Há equivalente do "const" do C++ em PHP?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o equivalent do const é, como o the loser já referenciou a função define().

que funciona da seguinte forma:

vamos criar a constante "DB_NAME" para o nome da base de dados a ligar.

define("DB_NAME", "minha_base_de_dados");

ap artir deste momento ficas com a constante "DB_NAME" disponivel na tua aplicação bastado para isso chama-la ex:

<?php
define("DB_NAME", "minha_base_de_dados");
define("DB_HOST", "meu_servidor_mysql");
define("DB_USER", "utilizador_mysql");
define("DB_PASS", "palavra_passe_utilizador");


$link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
$db = mysql_select_db(DB_NAME, $link);
?>

Fica bem

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A minha questão é como aplicaria o "const" a, por exemplo, um objecto, ou até mesmo a um vector.

Cumps  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como é que eu faria?

$array = array("coiso1" , "coiso2" , "coiso3");
define("const_array",serialize($array));

$array_nova = unserialize(const_array);

Não consegues definir uma array de constantes com o define.

value

    The value of the constant; only scalar and null values are allowed. Scalar values are integer, float, string or boolean values.

Além disso, a ideia de criar uma array de constantes não me parece muito boa.  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não me fiz entender.

O que eu estou a perguntar é se ha possibilidade de garantir que as propriedades de um objecto ou vector, por exemplo, nao se possam mudar.

Só posso falar do que sei de C++, e em C++ há uma diferenca grande entre um define e um const.

Por exemplo:

#define PI 3.14159 //define("PI", 3.1415);

const ClassName myObj; //as propriedades deste objecto nao vao poder ser alteradas

se por acaso o programador escrever isto

myObj.setSomePropriety("abc"); //isto vai dar erro

A minha pergunta é se há um equivalente em PHP.

Agora acho que me fiz entender melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu percebi a tua pergunta, e acho que o meu post respondeu a esta.

A resposta sucinta é "Não".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não me fiz entender.

O que eu estou a perguntar é se ha possibilidade de garantir que as propriedades de um objecto ou vector, por exemplo, nao se possam mudar.

Só posso falar do que sei de C++, e em C++ há uma diferenca grande entre um define e um const.

Por exemplo:

#define PI 3.14159 //define("PI", 3.1415);

const ClassName myObj; //as propriedades deste objecto nao vao poder ser alteradas

se por acaso o programador escrever isto

myObj.setSomePropriety("abc"); //isto vai dar erro

A minha pergunta é se há um equivalente em PHP.

Agora acho que me fiz entender melhor.

--

NIN, podes se brincares com os metodos magicos __get e __set, ou defenires constantes dentro da class exemplo: class teste { const VAR 'valor'; }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um Exemplo...

class Teste
{
    private $sVar1 = "teste";
    private $nVar2= 99999;

    public function __get($var)
    {
        return $this->$var;
    }
}

$oTeste = new Teste();
echo $oTeste->sVar1;
//ao tentares defenir, vai dar um erro, com isso poderas emular o "readOnly" numa classe de php

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pronto, trocando por miudos... A RESPOSTA E' SIM.

Ao definires uma variavel como  privada não das a possibilidade de ser acedida fora ao instanciares um objecto, mas com o metodo magico __get consegues retornar, com isso, consegues ler a informação da var, mas nao consegues defenir, isto porque a var e' privada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pronto, trocando por miudos... A RESPOSTA E' SIM.

Ao definires uma variavel como  privada não das a possibilidade de ser acedida fora ao instanciares um objecto, mas com o metodo magico __get consegues retornar, com isso, consegues ler a informação da var, mas nao consegues defenir, isto porque a var e' privada

Não era isso que ele queria.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não me fiz entender.

O que eu estou a perguntar é se ha possibilidade de garantir que as propriedades de um objecto ou vector, por exemplo, nao se possam mudar.

Só posso falar do que sei de C++, e em C++ há uma diferenca grande entre um define e um const.

Por exaemplo:

#define PI 3.14159 //define("PI", 3.1415);

const ClassName myObj; //as propriedades deste objecto nao vao poder ser alteradas

se por acaso o programador escrever isto

myObj.setSomePropriety("abc"); //isto vai dar erro

A minha pergunta é se há um equivalente em PHP.

Agora acho que me fiz entender melhor.

Desculpa la tar a martelar na mesma coisa... mas ou estou a entender mesmo muito mal ou era exactamente isto que ele precisava?

class ReadOnlyTest {

  private $sVar1 = 'bla';

  private function __get($var) {
      return $this->$var;
  }

  private function __set($var, $val) {
    throw new Exception('ReadOnly Class');
  }

  private function __unset($var) {
    throw new Exception('ReadOnly Class');
  }

  function __call($method, $args) {
$prefix = strtolower(substr($method, 0, 3));
$property = substr($method, 3);
    	if $prefix == "get" && isset($this->$property)) {
    return $this->$property;
}
if $prefix == "set") {
    throw new Exception('ReadOnly Class');
}
     }
}

ou seja... conseguiria ler qualquer propriedade de um objecto, mas nunca o poderia alterar, caso tentasse era enviado um erro, certo? ou estou a ficar xone' ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

My point is, isso abrange a class em geral, e não era isso que ele queria.

Pelo que percebi, ele queria criar um, e só um objecto com todos os membros e métodos de uma classe constantes, mas que essa classe, noutra instância, deixasse de agir desta forma, ou seja, que os valores não fossem sempre constantes.. :thumbsup:

Até porque ele não estava a falar só de classes em particular..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

My point is, isso abrange a class em geral, e não era isso que ele queria.

Pelo que percebi, ele queria criar um, e só um objecto com todos os membros e métodos de uma classe constantes, mas que essa classe, noutra instância, deixasse de agir desta forma, ou seja, que os valores não fossem sempre constantes.. :thumbsup:

Até porque ele não estava a falar só de classes em particular..

Pode simular o constante com o protected e verificações no __get e __set.

Em relação a tornar definições no config constantes, é mesmo usar o define.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

associando um atributo a class podemos defenir no constructor se é estática ou não assim já controlamos (aldrabamos lol) cada instância

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pode simular o constante com o protected e verificações no __get e __set.

A única coisa que posso dizer é que continuo a achar que não o perceberam, ou não estão a querer perceber. :(

That's my cue.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A única coisa que posso dizer é que continuo a achar que não o perceberam, ou não estão a querer perceber. :)

That's my cue.

Posso não ter percebido, aliás, li o tópico na diagonal pelo que é bem provável não ter percebido :(
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora