这个是练习页面
<?
/*UNIT6 面向对象的PHP*/
/*6.1理解面向对象的概念*/
/*6.1.1类和对象*/
//面向功能或者面向过程的软件被看作是过时的unfortunately,大部分的web脚本仍然是属于面向功能的。
//面向对象的操作语言必须支持多态性——不同的类对同一个操作有不同的行为。
//类的继承
//几个名词:类,对象,超类,父类,子类,派生类
/*6.2在php中创建类class*/
class luclass{
public $attribute1;//public创建了属性,记得加$
public $attribute2;
}
class luclass2{
function operation1(){}
function operation2($param1,$param2){}
//创建了一个类包含一个方法和一个有两个参数的方法
}
/*6.2.2构造函数*/
//创造一个我不知道什么意思的构造函数的类
class luclass3{
function __construct($param){
echo "Constructor called with parameter".$param."\.<br />";
}
}
//不知道这个怎么用比着葫芦画瓢吧
/*6.2.3析构函数*/
class luclass4{
function __destruct(){//析构函数括号中不含有任何参数,不包证这个语法是正确的。
}
}
/*6.3类的实例化*/
class luclass5{
function __construct($param){
echo "这个类将输出输入的字符:".$param."<br />";
}
}
new luclass5("hello,world!");
//截止到现在 我仍然不明白构造函数有什么用,类和函数有什么区别。。。
//好像这个地方不用构造函数不行,不用构造函数打印不出来东西。不使用函数直接在类里面用echo 会报错。
/*6.4使用类的属性 $this->*/
class luclass6{
public $attribute;
function operation($param){
$this->attribute="这个luclass6类的attribute属性是".$param;
echo $this->attribute;
}
}
//截止现在仍然不知道类里面的函数怎么调用
class luclass7{
public $ism;
}
$m=new luclass7();
$m->ism="yes";
echo $m->ism;
//创建了一个luclass7类,定义了一个属性ism。然后创建了一个属于luclass7的对象m,将这个对象的ism属性设置为yes
//但是php不建议使用这种方法。建议使用封装
class luclass8{
public $iss;
function __get($attribute){
return $this->$attribute;
}//返回调用的属性
function __set($attribute,$value){
$this->attribute=$value;
}
}
//日了狗了,这段函数也没什么用,说是最初设置的时候的可能这样设置的,跟luclass7一模一样的。
$s=new luclass8();
$s->iss="yes";
echo $s->iss;
class luteacher{
public $sex;
public $height;
public $name;
function __set($attribute,$value){
if($attribute=="sex" and $value=="男"||$value=="女"){
$this->sex=$value;
}
if($attribute=="height" and $value<=300||$value>=40){
$this->height=$value;
}
}
}
$lvnan=new luteacher();
$lvnan->name="吕楠";
$lvnan->sex="女";
$lvnan->height="160";
echo "这个老师就是".$lvnan->name.",性别".$lvnan->sex.",身高".$lvnan->height."厘米,学生们都很喜欢她。<br />";
/*6.5使用private and public 访问修饰符关键字控制访问*/
//访问修饰符:public(默认),private,和protected(介于他俩之间)
class luclass9{
public $sex;
public function __set($name,$value){
if($name=="sex"){
$this->sex=$value;
}
}
public function aaaaa(){
echo "这是class9类里面的一个动作。";
}
}
$a=new luclass9();
$a->sex="女";
echo $a->sex."<br />";
$a->aaaaa();
//上面这个就是类 操作的调用。
/*6.7在php中实现继承*/
class luteacher_cd extends luteacher{
public $quyu;
public $fangjia;
function fenxi(){
if ($this->quyu=="天府新区"){
$this->fangjia=12000;
echo "该老师所在区域房价".$this->fangjia."元。";
}else{
echo "该老师还未购房!";
}
}
}
$b=new luteacher_cd();
$b->name="路昊";
$b->quyu="天府新区";
$c=new luteacher_cd();
$c->name="文博";
$b->fenxi();
$c->fenxi();
//$a->fenxi();//a不属于luteacher_cd
/*6.7.1通过继承使用private、public和protected访问修饰控制符*/
class luclassA{
public function lupublic(){echo "public extends luclassA.<br />";}
private function luprivate(){echo "private extends luclassA.<br />";}
protected function luprotected(){echo "protected extends luclassA.<br />";}
}
class luclassB extends luclassA{
public $a;
public function extendss(){
$this->luprotected();
//return parent::luprivate();//不能通过parent::来调用已经被private的操作
}
}
$lua=new luclassA();
$lua->lupublic();
$lub=new luclassB;
//$lub->lupublic();
$lub->extendss();
/*6.7.2重载*/
class luA{
public $a="1",$b="2",$c="3";
function d(){
echo "it's default.";
}
}
$v1=new luA;
echo "<br />".$v1->a.$v1->b.$v1->c."<br />";
class luB extends luA{
public $b="b";
function d(){
echo "it's diffrent.";
}
function e(){
$this->d();
parent ::d();
//return parent ::$b;//此处报错,因为parent只可以用于操作不能用于变量。
}
}
$v2=new luB;
echo "<br />".$v2->a.$v2->b.$v2->c."<br />";
//子类将继承超类所有属性和操作,但是如果子类提供了替代定义,那么替代定义优先。
echo $v2->e();
/*学习中发现一个奇怪的例子*/
//可以通过parent ::参数传递的方法,调用的父类的private属性的东西
class luuA{
private $a="a";
private $b="b";
public $d="d";
protected $e="e";
public function c(){
$a=$this->a."x";//此处$a和$this->a不是一个东西哦
echo $this->a.$this->d.$this->e.$a;
}//我认为是这样的:在类里面如果使用了$this->a的a是一个private属性,那么$this->不因a被重写替代定而改变。就算是再把a变成pulic也不行。public和protercted就没事。
}
class luuB extends luuA{
public $a="aa";
public $d="dd";
protected $e="ee";
public function f(){
echo $this->a;
}
}
$z=new luuA;
echo $z->c()."<br />";
$x=new luuB;
echo $x->c();//虽然private $a被重写替代了,但是遇到this->了……
$x->f();
//privite 就像是一个锁住的属性。不让更改。
//如果想要把父类private属性的值用到子类上,需要使用$this->,但是估计这个没什么用。
/*插播一条代码打印前一天的时间*/
echo date("Y-m-d H:i:s",strtotime('-1 day',time()));
/*6.7.3使用final关键字来禁止继承和重载*/
//final只能修饰方法和类不能修饰属性,被修饰的方法不能在子类中覆盖到。lets try it。
final class luclass11{
public $a="deafult";
}
//class luclass12 extends luclass11{}//尝试继承会出现致命错误
class luclass13{
protected $a="deafult";
}
class luclass14 extends luclass13{
final public function a(){//加上了final关键词仍然可以运行
echo $this->a;
}
}
$c1=new luclass14;
$c1->a();
//private protected 不太一样
class luclass15 extends luclass14{
}
$c2=new luclass15;
$c2->a();
//方法a()仍然可以被继承
class luclass16 extends luclass14{
public function b(){
$this->a();
}
}
$c3=new luclass16;
$c3->b();
//方法a()仍然可以被调用
class luclass17 extends luclass14{
// public function a(){//当方法a()被重载替换时报错
// echo "im new a.";
// }
}
/*6.7.4PHP不支持多重继承*/
//对于已经继承了luclass14的luclass17,尝试让他再继承luclass13
//class luclass17 extends luclass13{}//此处报错Cannot redeclare class luclass17
interface jk1{
function c();
}
class jkclass1 implements jk1{
public function a(){
echo "a"; }
public function c(){
echo "c"; }
}
$jk=new jkclass1;
$jk->a();
//这个例子没什么用,现在不懂接口有什么用
/*6.8类的设计*/
//(简化简单简洁)
/*6.9编写类代码*/
class testpage{
public $content;
public $title="这是一个页面的标题";
public $keywords="关键词1,关键词2";
public $button=array("home"=>"home.php",
"contact"=>"contact.php",
"servrices"=>"services.php",
"sitemap"=>"sitmap.php"
);
public function display(){
echo "<html>\n<head>\n";
$this->displaytitle();
$this->displaykeywords();
$this->displaystyles();
echo "</head>\n</body>\n";
$this->displayheader();
$this->displaymenu($this->button);
$this->content;
$this->displayfooter();
echo "</body>\n</html>";
}
}
/*__________以上代码是为了练手的 没有什么用处_____________*/
/*程序清单6-1*/
echo <<<AAA
<a href="page.inc">这是一个用灵活的方法来建立页面的方法</a>
<a href="home.php">这个是测试页面</a>
AAA;
//$fp=fopen("page.inc","w");//省事儿的建立一个文件的方法(没什么用记得注视掉)
//fclose($fp);//没什么用
//readfile("page.inc");
if((strpos($_SERVER['PHP_SELF'],"test/unit6.php"))==false){echo "jia";};
echo __FILE__;//在其它地方看到的好东西
//$fp=fopen("aboutme.php","w");//省事儿的建立一个文件的方法(没什么用记得注视掉)
//fclose($fp);//没什么用
//成功了用类建立页面 感觉很爽,自己给自己出题目尝试一下。
/*在文件夹news中,建立100个类似的页面,并且以时间命名,从当前时间向前推100天。明明格式为news20170920.php*/
/*先生成100个页面并且写入内容*/
/*把目录重置好*/
if(file_exists("news/newstitle.txt")){unlink("news/newstitle.txt");}
for($i=0;$i<100;$i++){
$ei=$i-100;//提前的天数
$newsdate=date("Ymd",strtotime("$ei day",time()));
$fp=fopen("news/".$newsdate.".php","w+");
$str='<?
require("newspage.inc");
$newspage=new newspage();
$newspage->content="Today is '.$newsdate.'.<br /></br />";
$newspage->display();
?>';
flock($fp,LOCK_EX);
fwrite($fp,$str);
flock($fp,LOCK_UN);
fclose($fp);
/*写一个文件来储存他们的名字*/
$fp=fopen("news/newstitle.txt","a+");
flock($fp,LOCK_EX);
fwrite($fp,$newsdate."\r\n");
flock($fp,LOCK_UN);
fclose($fp);
echo "<br />".($i+1)." ".$newsdate.".php...成功!";
}
echo $thisfile=$_SERVER['DOCUMENT_ROOT']."test/";
//在一个业务繁忙的网站中,处理速度是很重要的,应当尽可能使用静态html网页,或者尽可能缓存脚本
//输出,从而减少在服务器中的载入工作
/*--------end---------*/
echo "<a href=\"unit6-2.php\">点击进入第二个unit6页面</a>";
fopen("unit6-2.php","w");
?>
unit6.2
<? /*书接前文*/ /*6.10理解PHP面向对象的高级功能*/ /*使用per-class常量*/ class perclass{ const a="123456789"; public $b; public static function echoo(){ echo"aaa"; } } class aaa extends perclass{}; echo perclass::a; perclass::echoo(); $a=new perclass (); /* instanceof means 是一个实例属于xxx*/ if($a instanceof perclass){echo "属于";} $b=new aaa(); if($b instanceof perclass){echo "属于";} /*类的类型提示的思想*/ function aaaa(aaa $a){ echo "right"; }//意思是$a必须instanceof aaa aaaa($b); /*6.10.4延迟静态绑定*/ class AA{ public static function who(){ echo "11"; } public static function test(){ static::who(); } } class BB extends AA{ public static function who(){ echo "22"; } } BB::test();//应该返回22 //接下来看不用static用this的区别 class CC{ public function who(){ echo "11"; } public function test(){ $this->who(); } } class DD extends CC{ public function who(){ echo "22"; } } $c=new DD(); $c->test();//应该返回22 class EE{ private $who="11";//此处private和public、protected的值不一样 public function test(){ echo $this->who; } } class FF extends EE{ public $who="22"; } $d=new FF; $d->test();//应该返回22 //综上所诉我记错了,只有$who为private的时候才会打印11 //综上所述所谓的延迟静态绑定就是如此的,只是一个解释而已,没什么用。这个是合乎实理的。 //教材只是为了说明父类函数test可以引用子类的static who,但是实际上我认为子类在创建的时候已经创建了一个 //子类的test,子类的test调用子类的who,多么合情合理啊。解释做什么呢? /*6.10.5克隆对象*/ //没看明白有什么用,通过一个例子看看。 /* $x=111; $y=clone $x; echo "<br />$x $y "; $x=0; echo "<br />$x $y "; reset($x); echo "<br />$x $y "; */ //例子运行失败 特么的clone只能用于对象。再来 $x=clone $d; echo $x->who;//11 //难道不能用“=”吗? $y=$d; echo "M<br />"; $y->test(); //也可以啊…… 那有毛用?网上搜索了一下 指向不同的内存。 echo "<br />"; $d->who="new"; echo $x->who;//x是克隆的 新的内存 echo $y->who;//y是赋值的 跟着d变化 =自带&地址符 //搜第四内,好像和数不太一样? $a1=1; $b1=$a1; $b2=&$a1; $a1=2; echo "<br />$a1 $b1 $b2";//果然不一样 @reset($a1);//reset好像是专门针对数组的,这条报错,不起作用 unset($a1);//会打断地址符的链接 $a1=3; echo "<br />$a1 $b1 $b2"; /*6.10.6使用抽象类*/ abstract class chouxiang{} //new chouxiang();//报错,抽象类不能实例化 //抽象类不能实例化 里面的方法也不能实现,真搞不懂有什么用,以后再看吧 /*6.10.7使用__call()重载方法*/ //这本书讲的不明白 我去别的地方看一下。 //__call如果在类中调用一个不存在的方法,就会自动调用__call class studycall{ function __call($name,$farray){ echo "我被调用了!"; } } $call1=new studycall(); $call1->te22ast(1); //现在懂了。。。试一发 class studycall2{ public function __call($name,$farray){ $farraystr=""; foreach($farray as $v){$farraystr.=$v.",";} echo "<br />你所调用的函数function ".$name."()不存在!你输入的参数(".rtrim($farraystr,',').")我们无法计算。"; } } $call2=new studycall2(); $call2->displayname(2,3,"hiugsafil","ksdfgaiuhgo",22,"afhauhfioahwoeifhao"); /*6.10.8使用__autoload*/ //当实例化一个没有声明的类的时候调用,他不是类方法而是一个函数 function __autoload($name){ include_once($name.".inc"); echo "不要报错了啊!还是致命的!"; //我在函数里加载一个类试试呢 class luhao{} } //@new luhao(); //卧槽 为什么还会报错? echo "123"; //网上说用sql_autoload_register();试一下呢 //sql_autoload_register(function($class_name){echo"没有这个类,我报错了没?";}); //$a3=new luhao(); //也不行…… //估计是什么没打开吧…… $a5=new page(); $a5->display(); //原来是这样用的……我好孤独啊自己一个人学。。。 /*6.10.9实现迭代器和迭代……卧槽 看起来就好难*/ class myclass1{ public $a=3; public $b=4; public $c=5; public $d=6; } $e1=new myclass1(); foreach($e1 as $key=>$value){ echo $key."=>".$value."<br />"; } //通过搜索了解了迭代和接口的意思(大概意思),文中的是一个基类,比较难懂,应该放弃,以后再看 //现在还不知道objectiterrator是不是系统自带的,如果不是的话要回来读懂它。 //接口类似于提前定义一个子类,迭代就是不停地换变量里的数据(还不确定) /*6.10.10将类转化成字符串*/ //__tostring()尝试打印时会调用这个函数 //var_export()此函数返回关于传递给该函数的变量的结构信息,它和var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码 class myclass2{ public $a=2; public $b=3.14; public function __tostring(){ //return var_export($this,true);//tostring 必须用return来使用这个var_export()函数 echo"<br />"; return var_dump($this); } } $f=new myclass2; print_r($f); /*6.10.11使用反射*/ $classs=new reflectionclass ("page");//估计这个也是一个系统函数 它内部还带了一个__tostring echo "<pre>".$classs."</pre>"; /*-------------------end unit6这一章迷迷糊糊看完了*/ ?>
page.inc
<?php
class page{
public $content;
public $title="Luhao's test web.";
public $keywords="luhao,test,husband";
public $button=array("home"=>"home.php",
"contact"=>"contact.php",
"service"=>"services.php",
"sitemap"=>"sitemap.php",
"news"=>"news.php");
public function __set($name,$value){
$this->attribute=$value;
}//感觉这个可以省略
public function display(){
echo "<html>\n<head>\n";
$this->displaytitle();
$this->displaykeywords();
$this->displaystyle();
echo "</head>\n<body>\n";
$this->displayheader();
$this->displaymenu($this->button);
echo $this->content;
$this->displayfooter();
echo"</body>\n</html>\n";
}
public function displaytitle(){
echo "<title>".$this->title."</title>";
}
public function displaykeywords(){
echo "<meta name=\"keywords\" content=\"".$this->keywords."\">";
}
public function displaystyle(){
echo "
<style>
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
}
</style>";
}
public function displayheader(){
?>
<table width="100%" cellpadding="2" cellspacing="0" border="0">
<tr bgcolor="#000000">
<td align="left"><img src="img/logo.gif" /></td>
<td><h1>Luhao's Test Web</h1></td>
<td align="right"><img src="img/logo.gif" /></td>
</tr>
</table>
<?
}
public function displaymenu($button){
echo "<table width=\"100%\" bgcolor=\"#FFFFFF\" cellpadding=\"4\" cellspacing=\"4\">\n<tr>\n";
$width=100/count($button);
while (list($name,$url)=each($button)){
$this->displaybutton($width,$name,$url,$this->isurlcurrentpage($url));
}
echo"</tr>\n</table>\n";
}
public function isurlcurrentpage($url){//判断是否是当前页面
if(strpos($_SERVER['PHP_SELF'],$url)==false){
return false;
}else{
return true;
}
}
public function displaybutton($width,$name,$url,$active=false){
if($active==false){
echo "<td width=\"".$width."%\"><a href=\"".$url."\"><img src=\"img/s-logo.gif\" border=\"0\" /><span class=\"menu\">".$name."</span></a></td>";
}elseif($active==true){
echo "<td width=\"".$width."%\"><img src=\"img/side-logo.gif\" border=\"0\" /><span class=\"menu\">".$name."</span></td>";
}
}
public function displayfooter(){
?>
<table width="100%" bgcolor="black" cellpadding="12" border="0">
<tr>
<td>
<p class="foot">© LuHao's WEB.</p>
<p class="foot">Please see my <a href ="aboutme.html">legal
information page</a></p>
</td>
</tr>
</table>
<?
}
}
?>
home.php(其他的都差不多)
<?
require("page.inc");
$homepage=new page();
$homepage->content="Welcome to my page.";
$homepage->display();
?>
///
news.php
<?
require("page.inc");
$newstitle=file("news/newstitle.txt");
$ahref="";
foreach($newstitle as $v){
$ahref.= "<a href=\"news/".$v.".php\" style=\"color:red\">".$v."</a><br />";
}
//echo $ahref;
$newspage=new page();
$newspage->content="<center>THESE ARE SOME NEWS.<br /></br />".$ahref."</center>";
$newspage->display();
?>
/
news/newspage.inc
<?
require("../page.inc");
class newspage extends page{
public function displayheader(){
?>
<table width="100%" cellpadding="2" cellspacing="0" border="0">
<tr bgcolor="#000000">
<td align="left"><img src="../img/logo.gif" /></td>
<td><h1>Luhao's Test Web</h1></td>
<td align="right"><img src="../img/logo.gif" /></td>
</tr>
</table>
<?
}
public function displaybutton($width,$name,$url,$active=false){
if($active==false){
echo "<td width=\"".$width."%\"><a href=\"../".$url."\"><img src=\"../img/s-logo.gif\" border=\"0\" /><span class=\"menu\">".$name."</span></a></td>";
}elseif($active==true){
echo "<td width=\"".$width."%\"><img src=\"../img/side-logo.gif\" border=\"0\" /><span class=\"menu\">".$name."</span></td>";
}
}
}
?>