Download - Tópicos de Sistemas de Informação A
![Page 1: Tópicos de Sistemas de Informação A](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/1.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/2.jpg)
PHP5 OOP
![Page 3: Tópicos de Sistemas de Informação A](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/28.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/29.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/30.jpg)
Interfaces
Interfaces permitem definir uma “API” que a classe deve proporcionar.
![Page 31: Tópicos de Sistemas de Informação A](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/31.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/33.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/38.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/40.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/41.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/42.jpg)
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](https://reader036.vdocuments.com.br/reader036/viewer/2022062502/56813b5c550346895da45318/html5/thumbnails/43.jpg)
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.