文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>读书笔记——第三篇

读书笔记——第三篇

时间:2007-12-17  来源:aport


                                                                                                                                                                第五章 代码重用和函数编写
5.1 代码重用
可靠性、一致性
5.2 使用require()和include()函数
require('filename');//不区分扩展名
使用require()制作web站点模版
原页面:
  TLA Consulting Pty Ltd      h1 {color:white; font-size:24pt; text-align:center;        font-family:arial,sans-serif}    .menu {color:white; font-size:12pt; text-align:center;           font-family:arial,sans-serif; font-weight:bold}    td {background:black}    p {color:black; font-size:12pt; text-align:justify;       font-family:arial,sans-serif}    p.foot {color:white; font-size:9pt; text-align:center;            font-family:arial,sans-serif; font-weight:bold}    a:link,a:visited,a:active {color:white}                        TLA Consulting                             Home           Contact           Services           Site Map        Welcome to the home of TLA Consulting.  Please take some time to get to know us.  We specialize in serving your business needs  and hope to hear from you soon.                © TLA Consulting Pty Ltd.      Please see our legal information page              require之后:
  require('header.inc');?>    Welcome to the home of TLA Consulting.  Please take some time to get to know us.  We specialize in serving your business needs  and hope to hear from you soon.  require('footer.inc');?>
读纯文本的东西建议用readfile()//安全
include()与requie()几乎等价,只是出现错误的时候require给出致命信息,include只给警告
require_once()和include_once()//确保一个被包含的文件只能被包含一次
php.ini中设置页眉页脚
auto_prepend_file = "/home/username/include/header.inc"
auto_append_file = "/home/username/include/footer.inc"
//apache中定义单个目录在.htaccess中添加:
  php_value auto_prepend_file  "/home/username/include/header.inc"
php_value auto_append_file   "/home/username/include/footer.inc"
5.4 php中使用函数
调用函数不区分大小写,这和变量不同
5.5 为什么要定义自己的函数
  有许多时候所需要的东西是语言的创建都无法预见到的.我们的代码可能是已有函数和自己逻辑的混合体.
5.6 了解基本的函数结构
function my_function()
{
echo 'My function was called';
}
注: $name = fopen; $name();//这是合法的
5.7 使用参数
function create_table($data){  echo '';  reset($data); // Remember this is used to point to the beginning  $value = current($data);  while ($value)  {     echo "$value\n";     $value = next($data);  }  echo '';}$my_array = array('Line one.','Line two.','Line three.');create_table($my_array);?>
可选参数:

function create_table2( $data, $border = 1, $cellpadding = 4, $cellspaceing = 4)
{
  echo "";
  reset($data);
  $value = current($data);
  while ($value)
  {
    echo "$value\n";
    $value = next($data);
  }
  echo '';
}
function var_args(){  echo "Number of parameters:";  echo func_num_args();  echo '
';  $args = func_get_args();  foreach ($args as $arg)    echo $arg.'
';}var_args(1,2,3);var_args("hello", 47.3);?>
// func_num_args()返回传入参数个数
// func_get_args()返回传入参数作为元素的数组
// func_get_arg() 每次返回一个参数,但要参数个数作为本身的参数
5.8 理解作用域
局部变量:函数内声明,函数内使用
全局变量:文件内声明,文件内使用
特殊超级变量:函数内外部均可见
require(),include()不影响作用域
global:用来手动指定一个在函数中定义或者使用的变量具有全局作用域.
unset($variable_name)删除变量
5.9  参数的引用传递和值传递
引用传递会在函数内部创建一个变量的副本,值传递需要在声明函数时在参数前面加上&
5.10 从函数中返回
  当一个函数执行结束时,要么是因为所有的命令都执行完了,要么就是因为使用了关键字"return"
5.11 从函数返回一个值
function larger($x, $y)
{
if(!isset($x)||!isset($y))
    return false;
else if ($x>=$y)
    return $x;
else
    return $y;
}
5.12 递归
function reverse_r($str)
{
  if (strlen($str)>0)
    reverse_r(substr($str, 1))
  echo substr($str, 0, 1);
  return;
}
反向打印字符串
第六章 面向对象的PHP
6.1 面向对象的概念
   对象是一个被保存数据和操作这些数据的操作方法的惟一、可标识的集合.我们用不同的变量作为对象的句柄(唯一标识符)
   类是表示彼此之间可能互不相同,但是必须具有一些共同点的对象集合.
多态性:不同的类对同一操作可以有不同的行为.只有类的成员函数可以是多态的.
继承: 允许我们使用子类在类之间创建层次关系;子类将从它的超类继承属性和操作.
6.2 在PHP中创建类、属性和操作
class classname
{
  var $attribute1;
  var $attribute2;
  function operation1()
  {
  }
  function2 operation2($param1, $param2)
  {
  }
}
构造函数: 创建一个对象时,将调用构造函数执行有用的初始化任务;
//名称必须为__construct()
class classname
{
  function __construct($param)
  {
   echo "Constructor called with parameter $param
";
  }
}
析构函数: 允许在销毁一个类之前执行一些操作或者完成一些功能,这些操作或者功能通常在所有对该类的引用都被重置或超出作用域时自动发生;名称必须__destruct();且不能带有任何参数.
6.3 类的实例化
class classname
{
  function __construct($param)
  {
    echo "Constructor called with parameter $param
";
  }
}
$a = new classname('First');
$b = new classname('Second');
$C = new classname('Third');
6.4 使用类的属性
class classname
{
var $attribute;
function operation($param)
{
  $this->attribute = $param;
  echo $this->attribute;
}
}
类外部访问类的属性
class classname
{
var $attribute;
}
$a = new classname();
$a->attribute = 'value';
echo $a->attribute;
__get()和__set()访问属性
class classname
{
var $attribute;
function __get($name)
{
  return $this->$name;
}
function __set($name, $value)
{
  $this->$name = $value;
}
}
function __set($name, $value)
{
  if($name = 'attribute' && $value >= 0 && $value attribute = $value;
}
6.5 使用private 和public控制访问
public默认选项,可以在类的内部和外部访问
private,只能在类的内部使用;私有的属性和方法不会被继承.
protected,只能在类的内部访问,但能继承
class classname
{
public $attribute;
public function __get($name)
{
   return $this->$name;
}
public function __set($name, $value)
{
  $this->$name = $value;
}
}
//修饰符替换了var
6.6 类操作的调用
通过使用其名称以及将所有所需参数放置在括号中.
$x = $a->operation('test');
6.7 在PHP中实现继承
class B extends A
{
  var $attribute2;
  function operaton2()
  {
  }
}
通过使用private和protected访问修饰符控制可见性
//protected不可继承
重载 : 在子类中给属性或者操作赋予不同的值或者功能叫重载
       parent关键字允许调用父类操作的最初版本parent::operation(),但是属性仍然会用当前属性.
final禁止继承和重载
final function()
final class A
理解多重继承:PHP不支持多重继承,只允许有一个父类.
理解接口: PHP 中的接口实现可以看作是多重继承问题的解决方法.接口的思想是指定一个实现了该接口的类必须实现的一系列函数.
interface Displayable
{
  function display();
}
class webpage implements Displayable
{
  function display()
  {
   //....
  }
}
//如果没有实现接口中指定的方法将产生一个致使错误.
6.8 类的设计
以PAGE类为例:
允许在需要修改某些页面元素的进修,只在一处进行修改
页面大部分区域有缺省内容,但能够在需要的地方修改每个元素.
识别哪一个页面是当前浏览页,并作出相应反映
允许使用特定的页面代替标准页面
6.9 编写类代码
完整的page类
class Page{  // class Page's attributes  public $content;  public $title = 'TLA Consulting Pty Ltd';  public $keywords = 'TLA Consulting, Three Letter Abbreviation,                    some of my best friends are search engines';  public $buttons = array( 'Home'     => 'home.php',                         'Contact'  => 'contact.php',                         'Services' => 'services.php',                         'Site Map' => 'map.php'                      );  // class Page's operations  public function __set($name, $value)  {    $this->$name = $value;  }  public function Display()  {    echo "\n\n";    $this -> DisplayTitle();    $this -> DisplayKeywords();    $this -> DisplayStyles();    echo "\n\n";    $this -> DisplayHeader();    $this -> DisplayMenu($this->buttons);    echo $this->content;    $this -> DisplayFooter();    echo "\n\n";  }  public function DisplayTitle()  {    echo ' '.$this->title.' ';  }  public function DisplayKeywords()  {    echo "keywords\" />";  }  public function DisplayStyles()  { ?>         h1 {color:white; font-size:24pt; text-align:center;         font-family:arial,sans-serif}    .menu {color:white; font-size:12pt; text-align:center;            font-family:arial,sans-serif; font-weight:bold}    td {background:black}    p {color:black; font-size:12pt; text-align:justify;        font-family:arial,sans-serif}    p.foot {color:white; font-size:9pt; text-align:center;             font-family:arial,sans-serif; font-weight:bold}    a:link,a:visited,a:active {color:white}    }  public function DisplayHeader()  { ?>                       TLA Consulting Pty Ltd              }  public function DisplayMenu($buttons)  {    echo "                cellspacing='4'\n";    echo "  \n";    //calculate button size    $width = 100/count($buttons);    while (list($name, $url) = each($buttons))    {      $this -> DisplayButton($width, $name, $url, !$this->IsURLCurrentPage($url));    }    echo "  \n";    echo "\n";  }  public function IsURLCurrentPage($url)  {    if(strpos($_SERVER['PHP_SELF'], $url )==false)    {      return false;    }    else    {      return true;    }  }  public function DisplayButton($width, $name, $url, $active = true)  {    if ($active)    {      echo "                                    $name";    }      else    {      echo "                        $name";    }    }  public function DisplayFooter()  {?>                      © TLA Consulting Pty Ltd.        Please see our                       legal information page                }}?>
//php函数可以在调用他的代码后面定义这是允许的
使用PAGE类创建页面
  require ('page.inc');    $homepage = new Page();   $homepage->content =' Welcome to the home of TLA Consulting.                            Please take some time to get to know us.                          We specialize in serving your business needs                           and hope to hear from you soon.';  $homepage->Display();?>
重载实现创建不同样式的页面
  require ('page.inc');    class ServicesPage extends Page  {    private $row2buttons = array( 'Re-engineering' => 'reengineering.php',                              'Standards Compliance' => 'standards.php',                              'Buzzword Compliance' => 'buzzword.php',                               'Mission Statements' => 'mission.php'                            );    public function Display()    {      echo "\n\n";      $this -> DisplayTitle();      $this -> DisplayKeywords();      $this -> DisplayStyles();      echo "\n\n";      $this -> DisplayHeader();      $this -> DisplayMenu($this->buttons);      $this -> DisplayMenu($this->row2buttons);      echo $this->content;      $this -> DisplayFooter();      echo "\n\n";    }  }  $services = new ServicesPage();  $services -> content ='At TLA Consulting, we offer a number of services.               Perhaps the productivity of your employees would              improve if we re-engineered your business.             Maybe all your business needs is a fresh mission              statement, or a new batch of buzzwords.';  $services -> Display();?>
5.10 PHP面向对象的高级功能
PHP5对象是按引用传递的
PHP5可以间接引用由函数返回的对象,select_object()->display();
per-class常量:可在类不初始化的情况下使用
静态方法:可在类未初始化的情况下使用方法
class Math
{
  const pi = 3.14159;
  static function squared($input)
  {
   return $input*$input;
  }
}
echo 'Math::pi = '.Math::pi."\n";
检查类的类型和类型提示:instanceof关键字允许检查一个对象的类型是否是特定类的实例,是否是从某个类继承过来或者是否实现的某个接口.
$b instanceof B
function check_hint(B $someclass)
{
}
克隆对象:$c = clone $b
如果不需要克隆过来的默认行为,必须在基类中创建一个__clone()方法;当使用clone关键字时该方法被调用.
使用抽象类:不能被实例化,其中抽象方法只提供了一个方法的声明,不能被具体实现;包含抽象方法的类必须是抽象类.
abstract class A
{
  abstract function operationX($param1, $param2);
}
使用__call重载方法
PHP中要实现重载必须实现__call()方法
        class Overload{
                public function __call($method, $p){
                        if($method == 'display'){
                                if(is_object($p[0])){
                                        $this->displayObject($p[0]);
                                }
                                else if(is_array($p[0])){
                                        $this->displayArray($p[0]);
                                }
                                else{
                                        $this->displayScalar($p[0]);
                                }
                        }
                }
               
                public function displayObject($p){
                        echo ("你传入的是个对象,内容如下:
");
                        print_r($p);
                        echo "";
                }
               
                public function displayArray($p){
                        echo ("你传入的是个数组,内容如下:
");
                        print_r($p);
                        echo "";
                }
               
                public function displayScalar($p){
                        echo ("你传入的是个单独变量,内容如下:
".$p);
                        echo "";
                }
        }
       
        $ov = new Overload();
        $ov->display(array(1,2,3));
        $ov->display('Cat');
?>
//以上代码不用实现任何display()方法.
使用__autoload()方法:它不是一个类方法,是一个单独的函数;可以在任何类声明之外声明这个函数.如果实现了这个函数,它将在实例化一个还没有被声明的类时自动调用.
function __autoload($name)
{
  include_once $name.'.php';
}
__autoload()方法的主要用途是尝试包括或者要求任何用来初始化所需类的文件.
实现迭代器和迭代
   要实现一个迭代器,必须将要迭代的类实现IteratorAggregate接口,并且定义一个能够返回该迭代类实例的getIterator方法.这个类必须实现Iterator接口,该接口提供了一系列必须实现的方法.
class ObjectIterator implements Iterator {   private $obj;   private $count;   private $currentIndex;   function __construct($obj)    {     $this->obj = $obj;     $this->count = count($this->obj->data);   }   function rewind()    {     $this->currentIndex = 0;   }   function valid()    {     return $this->currentIndex count;   }   function key()    {     return $this->currentIndex;   }   function current()    {     return $this->obj->data[$this->currentIndex];   }   function next()    {     $this->currentIndex++;   }}class Object implements IteratorAggregate {  public $data = array();    function __construct($in)  {    $this->data = $in;  }  function getIterator()   {    return new ObjectIterator($this);  }} $myObject = new Object(array(2, 4, 6, 8, 10));$myIterator = $myObj->getIterator();for($myIterator->rewind(); $myIterator->valid(); $myIterator->next()) {  $key = $myIterator->key();  $value = $myIterator->current();  echo "$key => $value
";}?>
使用Iterator类的原因就是即使潜在的实现发生了变化,数据的接口还是不会发生变化.
将类转换成字符串__toString():如果在类中实现了一个__toString()函数,当尝试打印该类时,可以调用这个函数
class Printable
{
var $testone;
var $testtwo;
public function __toString()
{
   return(var_export($this, TRUE));
}
}
$p = new Printable;
echo $p;
//var_export()函数打印出了类中的所有属性
使用Reflection反射API:反射是通过访问已有类和对象来找到类和对象的结构和内容的能力.
';
echo $class;
echo '';
?>
//使用了Reflection类的__toString()方法来打印这个数据.
第七章 异常处理
7.1 异常处理的概念
异常处理的思想是代码在try代码块被除数调用执行.
try
{
//code
}
如果try代码块出现错误,我们可以执行一个抛出异常的操作.PHP中异常必须手动抛出:
throw new Exception('message', code);
throw关键字将触发异常处理机制.它是一个语言结构,而不是一个函数,但是必须给它传递一个值.它要求接收一个对象.
最后,在try代码块之后,必须至少给出一个catch代码块:
catch(typehint excepton)
{
  // handle exception
}
传递给catch代码块的对象(也是被catch代码块捕获的)就是导致异常并传递给throw语句的对象(被throw语句抛出).
getCode().':'.$e->getMessage().'in'.$e->getFile().'on line '.$e->getLine().'
';
}
?>
7.2 Exception类:其构造函数需要两个参数,一个错误消息和一个错误代码
内置方法:
getCode()返回传给构造函数的代码
getMessage()返回传递给构造函数的消息
getFile()返回产生异常的代码文件的完整路径
getLine()返回代码文件中产生异常的代码的行号
getTrace()返回一个包含了产生异常的代码回退路径的数组
getTraceAsString()返回与上面相同的消息,消息被格式化成一个字条串
_toString()允许简单地显示Exception对象,并且给出以上所有方法可以提供的信息.
7.3 用户自定义异常
class Exception{  function __construct(string $message = NULL, int $code = 0)  {   if (func_num_args())     {       $this->message = $message;     }   $this->code = $code;   $this->file = __FILE__;   $this->line = __LINE__;   $this->trace = debug_backtrace();   $this->string = StringFormat($this);  }protected $message = nknown exception;protected $code = 0;protected $file;protected $line;private $trace;private $string;final function getMessage() {  return $this->message; }final function getCode(){  return $this->code;}final function getFile(){  return $this->file;}final function getFrace(){  return $this->trace;}final function getTraceAsString(){ return self::TraceFormat($this);}function __toString(){return $this->string;}static private function StringFormat(Exception $exception){ // //}static private function TraceFormat(Exception $exception){////}}?>7.4 实例程序异常处理  require_once('file_exceptions.php');    // create short variable names  $tireqty = $_POST['tireqty'];  $oilqty = $_POST['oilqty'];  $sparkqty = $_POST['sparkqty'];  $address = $_POST['address'];  $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];?>  Bob's Auto Parts - Order ResultsBob's Auto PartsOrder Results$date = date('H:i, jS F');echo 'Order processed at ';echo $date;echo '';echo 'Your order is as follows: ';$totalqty = 0;$totalqty = $tireqty + $oilqty + $sparkqty;echo 'Items ordered: '.$totalqty.'
';if( $totalqty == 0){  echo 'You did not order anything on the previous page!
';}else{  if ( $tireqty>0 )    echo $tireqty.' tires
';  if ( $oilqty>0 )    echo $oilqty.' bottles of oil
';  if ( $sparkqty>0 )    echo $sparkqty.' spark plugs
';}$totalamount = 0.00;define('TIREPRICE', 100);define('OILPRICE', 10);define('SPARKPRICE', 4);$totalamount = $tireqty * TIREPRICE             + $oilqty * OILPRICE             + $sparkqty * SPARKPRICE;$totalamount=number_format($totalamount, 2, '.', ' ');echo 'Total of order is '.$totalamount.'';echo 'Address to ship to is '.$address.'';$outputstring = $date."\t".$tireqty." tires \t".$oilqty." oil\t"                  .$sparkqty." spark plugs\t\$".$totalamount                  ."\t". $address."\n";// open file for appendingtry {  if (!($fp = @fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'ab')))      throw new fileOpenException();  if (!flock($fp, LOCK_EX))     throw new fileLockException();   if (!fwrite($fp, $outputstring, strlen($outputstring)))     throw new fileWriteException();  flock($fp, LOCK_UN);   fclose($fp);  echo 'Order written.';}catch (fileOpenException $foe){   echo 'Orders file could not be opened.  '         .'Please contact our webmaster for help.';}catch (Exception $e){   echo 'Your order could not be processed at this time.  '        .'Please try again later.';}?>
//最后的catch(Exception $e)将匹配所有继承它的类,如果异常没有匹配的catch语句,PHP将报告一个致命错误.
7.5 异常和PHP的其他错误处理机制
  复杂的错误处理将在25章"调试"中详细介绍
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

相关阅读 更多 +
排行榜 更多 +
楼梯球3d

楼梯球3d

休闲益智 下载
艾特足球最新版

艾特足球最新版

休闲益智 下载
贪食蛇战机手机版

贪食蛇战机手机版

休闲益智 下载