tópicos de sistemas de informação a

43
Tópicos de Sistemas de Informação A Carlos Oberdan Rolim Ciência da Computação

Upload: matteo

Post on 16-Mar-2016

31 views

Category:

Documents


2 download

DESCRIPTION

Tópicos de Sistemas de Informação A. Carlos Oberdan Rolim Ciência da Computação. PHP5 OOP. O básico. As operações básicas não mudaram desde o PHP4. class my_obj { var $foo; function my_obj() { // constructor $this->foo = 123; } function static_method($a) { return urlencode($a); } } - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Tópicos de Sistemas de Informação A

Tópicos de Sistemas de Informação A

Carlos Oberdan Rolim

Ciência da Computação

Page 2: Tópicos de Sistemas de Informação A

PHP5 OOP

Page 3: Tópicos de Sistemas de Informação A

O básico

As operações básicas não mudaram desde o PHP4.

class my_obj {

    var $foo;

    function my_obj() { // constructor

        $this->foo = 123;

    }

    function static_method($a) {

        return urlencode($a);

    }

}

$a = new my_obj; // instantiate an object

$a->my_obj(); // method calls

my_obj::static_method(123); // static method call

Page 4: Tópicos de Sistemas de Informação A

Similar, mas não o mesmo…

Enquanto a sintaxe permanece a mesma, internamente é diferenteObjetos são passados por referência e não por valorPHP 5 $a = new foo(); == PHP4 $a = &new foo(); Estilo antigo de construtores são suportados, mas mecanismos mais consistentes estão disponíveis. Método __construct()

Page 5: Tópicos de Sistemas de Informação A

PPP Annoyance

Palavra chave VAR deprecated e vai disparar um E_STRICT warning.

PHP Strict Standards: var: Deprecated. Please

use the public/private/protected modifiers in

obj.php on line 3.

Ao invés usar PUBLIC, PRIVATE ou PROTECTED

Page 6: Tópicos de Sistemas de Informação A

Código pronto para PHP5

<?php

class my_obj {

public $foo;

function __construct() { // constructor

$this->foo = 123;

}

// static methods need to be declared as static

// to prevent E_STRICT warning messages.

static function static_method($a) {

return urlencode($a);

}

}

$a = new my_obj;

my_obj::static_method("a b");

?>

Page 7: Tópicos de Sistemas de Informação A

Construtores

PHP 5 parent::__construct vai automaticamente determinar qual construtor pai está disponivel e chamará ele.

class main {

function main() { echo "Main Class\n"; }

}

class child extends main {

function __construct() {

parent::__construct();

echo "Child Class\n";

}

}

$a = new child;

Page 8: Tópicos de Sistemas de Informação A

Destrutores

class fileio {

private $fp;

function __construct ($file) {

$this->fp = fopen($file, "w");

}

function __destruct() {

// force PHP to sync data in buffers to disk

fflush($this->fp);

fclose($this->fp);

}

}

Destrutor é um método executado para destruir um objeto.

Page 9: Tópicos de Sistemas de Informação A

Objectos por referência

function foo($obj) { $obj->foo = 1; }$a = new StdClass; foo($a);echo $a->foo; // will print 1

class foo2 { function __construct() { $GLOBALS['zoom'] = $this; $this->a = 1; }}

$a = new foo2();echo ($a->a == $zoom->a); // will print 1

Não importa como objeto é passado para PHP5, sempre trabalha-se com o original.

Page 10: Tópicos de Sistemas de Informação A

E para fazer cópias?

Para copiar um objeto em PHP5 pode-se usar a palavra chave clone.

Faz a mesma coisa que $obj2 = $obj; fazia em PHP 4.

Page 11: Tópicos de Sistemas de Informação A

Sendo uma palavra chave, clone suporte diferente formas de ser usado.

class A { public $foo; }

$a = new A;

$a_copy = clone $a;

$a_another_copy = clone($a);

$a->foo = 1; $a_copy->foo = 2; $a_another_copy->foo = 3;

echo $a->foo . $a_copy->foo . $a_another_copy->foo;

// will print 123

Page 12: Tópicos de Sistemas de Informação A

Extendendo: Clone

__clone() pode ser usado para alterar a nova cópia

class A {

public $is_copy = FALSE;

public function __clone() {

$this->is_copy = TRUE;

}

}

$a = new A;

$b = clone $a;

var_dump($a->is_copy, $b->is_copy); // false, true

Page 13: Tópicos de Sistemas de Informação A

PPP

Como em outras linguagens OO pode-se limitar a visibilidade com o propósito de restrigir acessibilidade

PUBLIC – Accessivel a todos.PROTECTED – Pode ser usado internamente e dentro das classes extendidas.PRIVATE – Para uso interno somente.

Page 14: Tópicos de Sistemas de Informação A

Na prática

<?php

class sample {

public $a = 1; private $b = 2; protected $c = 3;

function __construct() {

echo $this->a . $this->b . $this->c;

}

}

class miniSample extends sample {

function __construct() {

echo $this->a . $this->b . $this->c;

}

}

$a = new sample(); // will print 123

$b = new miniSample();

// will print 13 & notice about undefined property miniSample::$b

echo $a->a . $a->b . $a->c;

// fatal error, access to private/protected property

?>

Page 15: Tópicos de Sistemas de Informação A

Aplicação PPP

<?php

class registrationData {

public $Login, $Fname, $Lname, $Address, $Country;

protected $id, $session_id, $ACL;

}

$a = new registrationData();

foreach ($a as $k => $v) {

if (isset($_POST[$k])) {

$a->$k = $_POST[$k];

}

}

?>

Page 16: Tópicos de Sistemas de Informação A

Propriedades estáticas

Objetos podem conter propriedades estáticas

<?php

class settings {

static $login = 'ilia‘, $passwd = '123456';

}

echo settings::$login; // will print "ilia"

$a = new settings();

echo $a->login; // undefined property warning

$a->login = "Local Value"; // parse error? (NOPE!)

echo $a->login; // will print "Local Value"

?>

Page 17: Tópicos de Sistemas de Informação A

Constantes de classe

Constantes são similares a propriedades estáticas porém nunca são alteradas.

class cc {

const value = 'abc 123';

function print_constant() {

// access class constants inside of the class

echo self::value;

}

}

echo cc::value; // access class constants outside of the class

Page 18: Tópicos de Sistemas de Informação A

PPP pode ser aplicada a métodos também!

Acesso a métodos pode ser limitado via PPP.

Ocula e previne acesso as funcionalidades internas.

Separação de dados.

Aumento de segurança.

Código mais limpo.

Page 19: Tópicos de Sistemas de Informação A

Métodos PPP

class mysql {

private $login, $pass, $host;

protected $resource, $error, $qp;

private function __construct() {

$this->resource = mysql_connect($this->host,

$this->login, $this->pass);

}

protected function exec_query($qry) {

if (!($this->qp = mysql_query($qry, $this->resource))) {

self::sqlError(mysql_error($this->resource));

}

}

private static function sqlError($str) {

open_log();

write_to_error_log($str);

close_log();

}

}

Page 20: Tópicos de Sistemas de Informação A

Métodos PPP

class database extends mysql {

function __construct() {

parent::__construct();

}

function insert($qry) {

$this->exec_query($qry);

return mysql_insert_id($this->resource);

}

function update($qry) {

$this->exec_query($qry);

return mysql_affected_rows($this->resource);

}

}

Page 21: Tópicos de Sistemas de Informação A

Final

PHP 5 permite classes e métodos serem declarados como FINAL.

Para métodos significa que ele não pode ser sobrescrito por classes filhas.

Classes definidas como final não podem ser extendidas.

Page 22: Tópicos de Sistemas de Informação A

Exemplo de uso de Final

class main {

function foo() {}

final private function bar() {}

}

class child extends main {

public function bar() {}

}

$a = new child();

Definindo um método como FINAL previne-se que classes de extensão sobreescrevam o método. Pode ser usado para evitar que métodos PRIVATE sejam reimplementados.

Page 23: Tópicos de Sistemas de Informação A

Exemplo de classe final

Classes declaradas como final não podem ser extendidas.

final class main {

function foo() {}

function bar() {}

}

class child extends main { }

$a = new child();

PHP Fatal error:

Class child may not inherit from final class (main)

Page 24: Tópicos de Sistemas de Informação A

Getter

O método, __get() permite ler as propriedades de um objeto virtual.

class makePassword {

function __get($name) {

if ($name == 'md5')

return substr(md5(rand()), 0, 8);

else if ($name == 'sha1')

return substr(sha1(rand()), 0, 8);

else

exit(“Invalid Property Name”);

}

} $a = new makePassword();

var_dump($a->md5, $a->sha1);

Page 25: Tópicos de Sistemas de Informação A

Setter

O método, __set() permite escrever as propriedades de um objeto virtual.

<?php

class userUpdate {

public $user_id;

function __construct() { db_cect() }

function __set($name, $value) {

db_update("UPDATE users SET {$name}=‘{$value}’ WHERE id={$user_id}");

}

}

?>

Page 26: Tópicos de Sistemas de Informação A

Métodos dinâmicos

O método __call() é usado parqa emular um método não declarado.

class math {

function __call($name, $arg) {

if (count($arg) > 2) return FALSE;

switch ($name) {

case 'add':

return $arg[0] + $arg[1]; break;

case 'sub':

return $arg[0] - $arg[1]; break;

case 'div':

return $arg[0] / $arg[1]; break;

}

}

}

Page 27: Tópicos de Sistemas de Informação A

Abstração de objetos

Classes abstratas permitem criar um conjunto de métodos que descrevam o comportamento de uma classe que será escrita.

Page 28: Tópicos de Sistemas de Informação A

Abstração

abstract class database {

public $errStr = '', $errNo = 0;

// these methods must be provided by extending classes

abstract protected function init($login,$pass,$host,$db);

abstract protected function execQuery($qry);

abstract protected function fetchRow($qryResource);

abstract protected function disconnect();

abstract protected function errorCode();

abstract protected function errorNo();

}

Métodos precedidos pela palavra chave abstract necessitam ser implementados nas classes de extensão.

Page 29: Tópicos de Sistemas de Informação A

Implementação

class mysql extends database {

private $c;

protected function init($login, $pass, $host, $db) {

$this->c = mysql_connect($host, $login, $pass);

mysql_select_db($db, $this->c);

}

protected function execQuery($qry) {

return mysql_query($qry, $this->c);

}

protected function fetchRow($res) {

return mysql_fetch_assoc($res);

}

protected function errorCode() {return mysql_error($this->c); }

protected function errorNo() { return mysql_errno($this->c); }

protected function disconnect() { mysql_close($this->c); }

}

Page 30: Tópicos de Sistemas de Informação A

Interfaces

Interfaces permitem definir uma “API” que a classe deve proporcionar.

Page 31: Tópicos de Sistemas de Informação A

Exemplo de Interface

Interfaces são extremamente úteis para definir uma API padrão e garantir que será implementada completamente.

interface webSafe {

public function encode($str);

public function decode($str);

}

interface sqlSafe {

public function textEncode($str);

public function binaryEncode($str);

}

Page 32: Tópicos de Sistemas de Informação A

Implementação

class safety Implements webSafe, sqlSafe {

public function encode($str) {

return htmlentities($str);

}

public function decode($str) {

return html_entity_decode($str);

}

public function textEncode($str) {

return pg_escape_string($str);

}

public function binaryEncode($str) {

return pg_escape_bytea($str);

}

}

Uma classe pode implementar múltiplas interfaces.

Page 33: Tópicos de Sistemas de Informação A

Object Iteration

PHP 5 permite que um objeto implemente internamente um iterator.

Para usar ele um objeto deve implementar os seguintes métodos:

rewind

current

key

next

valid

Page 34: Tópicos de Sistemas de Informação A

File Iterator

class fileI Implements Iterator {

private $fp, $line = NULL, $pos = 0;

function __construct($path) {

$this->fp = fopen($path, "r");

}

public function rewind() {

rewind($this->fp);

}

public function current() {

if ($this->line === NULL) {

$this->line = fgets($this->fp);

}

return $this->line;

}

}

Page 35: Tópicos de Sistemas de Informação A

File Iterator Cont.

public function key() {

if ($this->line === NULL) {

$this->line = fgets($this->fp);

}

if ($this->line === FALSE) return FALSE;

return $this->pos;

}

public function next() {

$this->line = fgets($this->fp);

++$this->pos;

return $this->line;

}

public function valid() {

return ($this->line !== FALSE);

}

Page 36: Tópicos de Sistemas de Informação A

File Iterator Cont.

<?php

function __autoload($class_name) {

require "./{$class_name}.php"; }

foreach (new fileI(__FILE__) as $k => $v) {

echo "{$k} {$v}";

}

?>

0 <?php

1 function __autoload($class_name) {

2 require "./{$class_name}.php";

3 }

4 foreach (new fileI(__FILE__) as $k => $v) {

5 echo "{$k} {$v}";

6 }

7 ?>

Uso:Uso:

Page 37: Tópicos de Sistemas de Informação A

Exceções

Exceçoes sao usadas para manifupacao de erros.

Um bloco pode ser executado dentro de um try {}

Qualquer erro vai para o processamento de catch {}

Page 38: Tópicos de Sistemas de Informação A

Classe de excessao

class Exception

{

protected $message = 'Unknown exception'; // exception message

protected $code = 0; // user defined exception code

protected $file; // source filename of exception

protected $line; // source line of exception

function __construct($message = null, $code = 0);

final function getMessage(); // message of exception

final function getCode(); // code of exception

final function getFile(); // source filename

final function getLine(); // source line

final function getTrace(); // backtrace array

final function getTraceAsString(); // trace as a string

function __toString(); // formatted string for display

}

Page 39: Tópicos de Sistemas de Informação A

Exemplo de uso da classe

<?php

try {

$fp = fopen("m:/file", "w");

if (!$fp) {

throw new Exception("Cannot open file.");

if (fwrite($fp, "abc") != 3)

throw new Exception("Failed to write data.");

if (!fclose($fp))

throw new Exception("Cannot close file.");

} catch (Exception $e) {

printf("Error on %s:%d %s\n",

$e->getFile(), $e->getLine(), $e->getMessage());

exit;

}

?>

Page 40: Tópicos de Sistemas de Informação A

Extendendo excessoes

class iliaException extends Exception {

public function __construct() {

parent::__construct($GLOBALS['php_errormsg']);

}

public function __toString() {

return sprintf("Error on [%s:%d]: %s\n",

$this->file, $this->line, $this->message);

}

}

ini_set("track_errors", 1); error_reporting(0);

try {

$fp = fopen("m:/file", "w");

if (!$fp) throw new iliaException;

if (fwrite($fp, "abc") != 3) throw new iliaException;

if (!fclose($fp)) throw new iliaException;

} catch (iliaException $e) { echo $e; }

Page 41: Tópicos de Sistemas de Informação A

Empilhamento de excessoes

<?php

try {

// will go into $try1

try {

// will go into $try2

} catch (Exception $try2) {

}

// will go into $try1

} catch (Exception $try1) {

}

?>

<?php

try {

$a = new dbConnection();

$a->execQuery();

$a->fetchData();

} catch (ConnectException $db) {

} catch (QueryException $qry) {

} catch (fetchException $dt) {

}

?>

Excessoes podem ser “empilhadas” e tratadas de acordo com o nome.

Page 42: Tópicos de Sistemas de Informação A

Exception Handler

A funcao, set_exception_handler() permite excessoes serem manipuladassem explicitamente estarem listadas no bloco try {} catch () {}

function exHndl($e) {

trigger_error($e->getLine());

}

set_exception_handler('exHndl');

$fp = fopen("m:/file", "w");

if (!$fp)

throw new iliaException;

if (fwrite($fp, "abc") != 3)

throw new iliaException;

if (!fclose($fp))

throw new iliaException;

Page 43: Tópicos de Sistemas de Informação A

Type Hinting

<?php

class Foo {}

function useFoo(Foo $obj) { /* ... */ }

$a = new Foo;

useFoo($a); // works

$b = new StdClass;

useFoo($b);

// Fatal error: Argument 1 must be an instance of Foo

?>

While PHP is still type insensitive, you can now specify what type of objects your functions and methods require.