Jump to content
acao

Optimização de código em página web

Recommended Posts

acao

boas

nas  páginas web, (pagina html ou php com os formulários etc) é bom, mau ou péssimo instanciar classes e carregar as propriedades?

exemplo:

$novaclas = new clascarro();
$novaclas->cor = $_post['cor'];
$novaclas->inserirCarro();

cumps

acao

Edited by brunoais
tags code + geshi

Share this post


Link to post
Share on other sites
RayBacK

Instanciar as classes não tem problema nenhum agora as propriedades convém sempre passar os dados por um filtro principalmente os que são inseridos por formulários por vários motivos de segurança.

Por exemplo neste caso estas a pedir ao utilizador que escolha uma cor, deves ter no código as cores disponíveis ou se aceitares todas as cores fazes um teste para validar se é uma cor.

Se tiveres duvidas como o fazer avisa.

Share this post


Link to post
Share on other sites
brunoais

Eu usaria:

$novaclas = new clascarro($_post['cor']);
$novaclas->inserirCarro();

Em vez de:

$novaclas = new clascarro();
$novaclas->cor = $_post['cor'];
$novaclas->inserirCarro();


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
acao

boas

obrigado pelas respostas.

as minhas duvidas são referentes à colocação de algum codigo php na pagina do blowser, porque se não prejudicar a segurança economizo algumas paginas e talvez algum javascript.

o codigo colocado foi apenas para ter uma ideia da minha duvida.

cumps

acao

Share this post


Link to post
Share on other sites
acao

O PHP não é visível por defeito ao utilizador final.

pois já estive averificar e não detetei nada, mas como normalmente os user dizem para separar o php da folha apresentada ao utilizador pensei que fosse mau colocar cod demasiado nessas paginas.

Eu usaria:

$novaclas = new clascarro($_post['cor']);
$novaclas->inserirCarro();

Em vez de:

utilizando a sua deixa eu utilizo o cod assim:

Classteste{
//propriedades

function metodo(){
//aqui utilizo a propriedade
}
}

//chamo assim

$Clas = New Classteste;
$Clas->Propriedade = "xpto";
$Clas->metodo;

ou assim:

Classteste{
//propriedades

function metodo($test1,$teste2){
$xpto = $test1;
$this->proriedade = $teste2;
}
}

//chamo assim

$Clas = New Classteste;
//se necessito da proprieda chamoa e ou só o metodo
$Clas->Propriedade = "xpto";

$Clas->metodo($var,"xpto");

nunca utilizei a sua deixa, será que pode exemplificar como nomeia a class.

cumps

acao

edit: obrigado pela ajuda, já percebi a cena, o parametro é passado no construtor.

cumps

acao

Edited by acao

Share this post


Link to post
Share on other sites
Mcgcaldaira

duvida sobre ontologias.

estou a desenvolver um trabalho de ontologias, na qual utilizo a ontologia cytiGML. estou a utilizar a ferramenta protégé. alguém me pode ajudar como inserir informação relacionado com o meu sitio no protege?

obrigada

Share this post


Link to post
Share on other sites
yoda

pois já estive averificar e não detetei nada, mas como normalmente os user dizem para separar o php da folha apresentada ao utilizador pensei que fosse mau colocar cod demasiado nessas paginas.

Não há problema, o PHP fica sempre (por defeito) escondido. Porém, misturar PHP e HTML em demasia (na mesma página por exemplo) torna mais difícil manter / actualizar o código, pela quantidade que existe no mesmo ficheiro. Por exemplo, em vez de misturares tudo, podes ter uma página para o PHP e outra para o HTML de cada página. Assumindo que tens uma página chamada site.com/home.php, terias um ficheiro /page/home.php e outro /view/home.php. Exemplo :

/page/home.php

$template = new View('home');

$data = array(
    'color' => $_POST['color'],
    'brand' => 'Toyota'
);

$car = new Car($data);

$car->save();

$template->msg = 'Hello World!';
$template->car = $car->brand;

$template->render();

/view/home.php

<p><?php echo $msg; ?></p>
<p>Your car : <?php echo $car; ?></p>

Usar classes "pode" aumentar a eficiência do site, se forem bem feitas, e isso não é uma ciência exacta pois existem n domínios e n necessidades. Analisa sempre a situação que tens em mãos e tenta descobrir a forma mais eficaz de correr o sistema tendo em conta os procedimentos que se repetem, a lógica do domínio (situação), etc.

Edited by yoda

Share this post


Link to post
Share on other sites
monteiroxxi

Boas,

Depois de ter lido os vários posts à questão formulada pelo acao fiquei com a sensação que muitos dos que responderam não percebem, em perfeitas condições, os fundamentos da linguagem PHP.

Como todos os programadores de PHP deveriam saber que PHP significa Hypertext Preprocessor e que o servidor devolve, sempre, ao cliente web um ficheiro HTML. Por esse motivo é impossível que no script lido pelo browser seja visível o código-fonte escrito em PHP mas sim o resultado para sua interpretação gerando um script em HTML, uma vez que PHP é uma linguagem interpretada e não compilada.

No que diz respeito à utilização ou não de classes sou da opinião que quando bem usadas tornam o exercício da programação muito mais facilitado, uma vez que assim tira-se partido dum dos paradigmas que esta linguagem engloba o POO (Programação Orientada pelos Objectos).

Para validar formulários o melhor é recorrer-se a Javascript uma vez que os formulários são validados do lado do cliente e não necessitam de um novo pedido HTTP para os mesmos sejam validados. Mas é importante, também, que exista uma validação em PHP para precaver diversas situações, como por exemplo, o utilizador ter desactivado o JS. Para validação de formulários em PHP poder-se-à recorrer também a tecnologias como o AJAX que permitem que seja feito um pedido HTTP que ter que toda a página seja reescrita mas só parte da mesma. Tal pode ser utilizado, por exemplo, para se saber se o nome de um determinado utilizador já encontra registado.

Espero que tenha respondido às dúvidas de forma esclarecedora.

Cumprimentos.

  • Vote 1

Share this post


Link to post
Share on other sites
acao

boas

obrigado a todos pelas respostas, estou registando tudo.

Eu usaria:

$novaclas = new clascarro($_post['cor']);
$novaclas->inserirCarro();

Em vez de:

aqui sobre a deixa do @brunoais, eu já postei que percebi a situação e de facto percebi, mas queria implementa-la na situação que estou a fazer porque ela é melhor do que estou a usar, porque assim as propriedades podem ficar privadas e é situação que me agrada.

mas na minha situação os parametros não são fixos(isto é: conforme o metodo a utilizar os parametros deveriam alterar),

ex: se utilizar o (metodo teste1() deveria ter os param campo1 campo2).

se utilizar o metodo teste2() deveria ter os param campo1 campo3).

um simples exemplo:

Class Classexemplo {
private $teste1;
private $teste2;
private $teste3;
function __construct($Campo1, $Campo2){
 $this->teste1 = $Campo1;
  $this->teste2 = $Campo2;
  $This->teste3 = $Campo3;
  }
 function metodo1($xpto, $Xpto){
 }
 function metodo2($xpt, $xpt){
}
}
//chamar
$NovaClass = New Classexemplo("Nome","Data")
$NovaClass->metodo1("sddf","poiu");

// PS:estou a escrever direto sem testar e não é o objectivo que funcione.
//agora como consegueria a situação seguinte:

$NovaClass1 = New Classexemplo($Campo1, $Campo2, $Campo3); //sei que se tivesse colocado 3 param no
//construtor tudo funcionaria, incluindo a passagem a string vazia pelo motivo de no metodo1 só usar 2 param.
//mas acontece que tenho necessidade de mostrar varias alternativas de param (bloco de 3,5,6, etc.
$NovaClass1->metodo2("xxxx", "YYYY");

espero que tenham compreendido a minha solicitação.

cumps

acao

Edited by acao

Share this post


Link to post
Share on other sites
acao

Isto?


class Carro()
{

 public function __construct()
 {
	  $arguments = func_get_args();

	  foreach ($arguments as $key=>$argument)
	  {
				echo 'argument '.$key.' : '$argument.'<br/>';
	  }

	  return $this;
 }
}
}

boas

@yoda obrigado pela resposta.

estive a tentar perceber a sua dica, e também já consultei o manual, mas não consegui implementar a ideia, julgo que terei que usar um if e talvez um ciclo for em vez do foreach, mas como vou mostrar os argumentos na class dependendo do metododo a selecionar posteriormente?

cumps

acao

Share this post


Link to post
Share on other sites
acao

Eu não percebi bem aquilo que pretendes, tentei adivinhar quando falaste em não ter de saber os argumentos de uma função. Se puderes explicar melhor, agradecia.

boas

1- tenho uma Classe aonde necessito de carregar as propriedades.

2- não é necessario serem todas carregas quando instancio a class.

3- quando faço o instanciamento da class queria mostrar apenas os argumentos das propriedades necessarias.

4- os argumentos/propriedades a carregar dependem do metodo que vou utilizar.

sei que poderia utilizar como argumento todas as propriedades e na passagem de dados os não necessarios nao os utilizava

ficavam vazios (sem valor).

o que queria era: ao instanciar apresentar x quantidade de argumentos e teriam que ser o (y,D,E e o Z) porque vou selecionar/correr o metodo1.

se for o metodo2 já podia necessitar apenas de 2 argumento para carregar duas propriedades e teriam que ser (D e o F)

cumps

acao

Share this post


Link to post
Share on other sites
yoda

Última tentativa :

class example {

    /*
         $data são todas as propriedades da classe, que ficam escondidas neste array.
         é aqui que defines os valores por defeito dessas propriedades
    */
    private $data = array(
         'color' => 'red'
    );

    /* 
         o construtor aceita apenas um array, que pode ou não estar vazio,
         e que vai ser unido com a propriedade $data da classe.
         caso existam chaves iguais, o valor da nova chave sobrepõe-se à antiga
    */
    public function __construct(array $data) {

         # caso o array não seja associativo
         if (!empty($data) && ((bool) count(array_filter(array_keys($data), 'is_string'))))
         {
              return false;
         }

         # caso queiras filtrar a informação que está a chegar
         $filtered = array();

         foreach ($data as $key=>$value)
         {
              if (method_exists($this, $key))
              {
                   $filtered[$key] = $this->{'filter_'.$key}($value);
              }
         }

         $data = array_merge($data, $filtered);

         $this->data = array_merge($this->data, $data);

         return $this;
    }

    /*
         caso queiras aceder às propriedades directamente a partir da classe instanciada,
         podes fazê-lo com este método :

         $example = new example(array('name' => 'yoda'));

         echo $example->name;

    */
    public function __get(string $key) {

         return array_key_exists($key, $this->data) ? $this->data[$key] : false;

    }

    /*
         caso queiras redefinir propriedades directamente a partir da classe instanciada,
         podes fazê-lo com este método :

         $example = new example(array('name' => 'yoda'));

         $example->name = 'luke';
         echo $example->name;

    */
    public function __set(string $key, $value) {

         $this->data[$key] == $value;

         return;

    }

    /*
         exemplo de filtro.
         os filtros são métodos que só são chamados se existirem e que se baseiam nas chaves
         do array usado para instanciar a classe. Não tem de ser método público.

    */

    public function filter_color($value) {

         return $value == 'red' ? '#FF0000' : false;

    }
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.