php 面向对象详解_封装性
第七章(5)面向对象详解_封装性
封装性:就是将对象内部的属性或方法封装在自己的对象内部,在对象内部可以被使用或访问,但在对象的外部或者其它对象里不能使用封装的成员.
封装使用的关键字:private
封装的含义:
1.把对象的全部属性和全部方法结合在一起,形成一个不可分割的独立的单位(对象).
2.信息隐蔽,即尽可能的隐蔽内部细节,对外形成一个边界(或者说对外形成一个屏障),只保留有限的对外的接口,使它与外部发生关系.
第七章(6)面向对象详解_封装时所用的四个常用的方法
带"__"加函数的方法是在某一时刻自动调用的方法.
__get(属性的名称) 直接去调用私有属性的时候调用__get的方法.
__set(1.属性名 2.属性值) 直接给私有属性赋值的时候调用__set的方法.
__isset(属性名称) 判断对象内部私有属性是否存在的时候调用__isset的方法.
__unset(属性名称) 删除对象内部私有属性的时候调用__unset的方法.
第七章(7)面向对象详解_继承
类的继承:继承就是对原有类的扩展.
新扩展的子类:1.class 2.原父类名称 3.extends继承关键字 4.新子类名称.
类的继承就是把父类里面所有的内容都继承到子类,除了私有的属性和方法.
第七章(8)面向对性详解_方法的覆盖和访问
类方法的重载:方法名称要与父类的相同,如要调用父类某方法的全部内容可以在子类方法里使用关键字pr]arent:: 如只调用部分就重写.
访问类型:
private 私有 只能在本类里进行访问.
protected 保护 只能在本类和子类里进行访问.
public 公有 不受限制,在本类,子类和外部都可以进行访问.
第七章(9)面向对象详解_常用的final,static,const关键字
final:只能用来定义类和方法.
作用:使用final定义的类不能被继承.
使用final定义的方法不能被重载覆盖.
static:将属性和方法定义成静态.
static可以修饰属性,也可以修饰方法.
使用static声明的方法里面不能使用非静态成员.
static的作用是只需要在类里面声明一次,此类产生的所有对象都有static修饰过属性和方法,但不会在内存里面反复使用内存,可有效的节约内存.
要访问static定义的属性或方法时使用 类名::定义的属性或方法,或使用felf::定义的属性或方法进行访问,使用对象不能直接进行访问.
const的作用是在类里面定义成员属性为常量.
const只能修饰属性.
const只能在声明的时候初始值.
使用const声明属性不用加$.
要访问const定义的属性使用 类名::定义的属性 进行访问,使用对象不能直接进行访问.
<?php
/**
* 作者 于恩水<yuenshui@126.com>
* 支持断点续传下载
* 实例代码:
* $down = new SD_DownLoad();
* $down->Down('E:/iso/MS.Office2003SP1.CHS.iso');
**/
class SD_DownLoad {
/**
* 下载的开始点
*
* @access private
* @var integer
*/
private $mDownStart;
/**
* 文件大小
*
* @access private
* @var integer
*/
private $mFileSize;
/**
* 文件句柄
*
* @access private
* @var integer
*/
private $mFileHandle;
/**
* 文件全路径
*
* @access private
* @var string
*/
private $mFilePath;
/**
* 文件下载时显示的文件名
*
* @access private
* @var string
*/
private $mFileName;
/**
* 构造函数
*
* @access public
* @return void
**/
public function __construct() {
}
/**
* 下载
*
* @param string $pFilePath 文件全路径
* @param string pFileName 文件下载时显示的文件名,缺省为实际文件名
* @access public
* @return void
**/
public function Down($pFilePath, $pFileName = '') {
$this->mFilePath = $pFilePath;
if(!$this->IniFile()) $this->SendError();
$this->mFileName = empty($pFileName) ? $this->GetFileName() : $pFileName;
$this->IniFile();
$this->SetStart();
$this->SetHeader();
$this->Send();
}
/**
* 初始化文件信息
*
* @access private
* @return boolean
**/
private function IniFile() {
if(!is_file($this->mFilePath)) return false;
$this->mFileHandle = fopen($this->mFilePath, 'rb');
$this->mFileSize = filesize($this->mFilePath);
return true;
}
/**
* 设置下载开始点
*
* @access private
* @return void
**/
private function SetStart() {
if (!empty($_SERVER['HTTP_RANGE']) && preg_match("/^bytes=([d]?)-([d]?)$/i", $_SERVER['HTTP_RANGE'], $match)) {
if(empty($match[1])) $this->mDownStart = $match[1];
fseek($this->mFileHandle, $this->mDownStart);
}
else {
$this->mDownStart = 0;
}
}
/**
* 设置http头
*
* @access private
* @return void
**/
private function SetHeader() {
@header("Cache-control: public");
@header("Pragma: public");
Header("Content-Length: " . ($this->mFileSize - $this->mDownStart));
if ($this->mDownStart > 0) {
@Header("HTTP/1.1 206 Partial Content");
Header("Content-Ranges: bytes" . $this->mDownStart . "-" . ($this->mFileSize - 1) . "/" . $this->mFileSize);
}
else {
Header("Accept-Ranges: bytes");
}
@header("Content-Type: application/octet-stream");
@header("Content-Disposition: attachment;filename=" . $this->mFileName);
}
/**
* 获取全路径里的文件名部分
*
* @access private
* @return string
**/
private function GetFileName() {
return basename ($this->mFilePath);
}
/**
* 发送数据
*
* @access private
* @return void
**/
private function Send() {
fpassthru($this->mFileHandle);
}
/**
* 发送错误
*
* @access public
* @return void
**/
public function SendError() {
@header("HTTP/1.0 404 Not Found");
@header("Status: 404 Not Found");
exit();
}
}
?>
PHP 中的数据库缓存原理
如果后台应用接收到浏览器端的查询请求后,每次都与数据库连接读取数据,势必增加数据库的负担。而往往有大量的请求是重复的,我们可以把这些重复的信息采用缓存技术保存下来,重复使用,这样,在某些情况下可以大大提高程序的性能。
1,缓存函数
cache_write函数接受$string参数,写到$file文件中。注意var_export函数,作用是:
此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。您可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。
这些参数可以是数组或常量,而这些数组或常量通常为从数据库中取出的记录,或非序列化(unserialize)对象后得到的数据。这些都可以缓存到本地的文本文件中。
cache_write函数很简单,需要读取数据时,先判断缓存是否存在,存在的话就不去连接数据库取数据,而是直接读出缓存的文本文件,直接产生了数组或常量等类型的数据,可以直接使用。
[php]
<?php
//文件名func.inc.php
define("CACHEDIR", "./"); //定义缓存文件夹
function cache_write($file, $string, $type = 'array')
{
if(is_array($string))
{
$type = strtolower($type);
if($type == 'array')
{
$string = "<?phpn return ".var_export($string,TRUE).";n?>";
}
elseif($type == 'constant')
{
$data='';
foreach($string as $key => $value)
$data .= "define('".strtoupper($key)."','".addslashes($value)."');n";
$string = "<?phpn".$data."n?>";
}
}
$strlen = file_put_contents(CACHEDIR.$file, $string);
chmod(CACHEDIR.$file, 0777);
return $strlen;
}
function cache_read($file)
{
$cachefile = CACHEDIR.$file;
if(!file_exists($cachefile))
return array();
return include $cachefile;
}
function cache_delete($file)
{
return @unlink(CACHEDIR.$file);
}
if(!function_exists('file_put_contents'))
{
define('FILE_APPEND', 8);
function file_put_contents($file, $string, $append = '')
{
$mode = $append == '' ? 'wb' : 'ab';
$fp = @fopen($file, $mode) or exit("Can not open file $file !");
flock($fp, LOCK_EX);
$stringlen = @fwrite($fp, $string);
flock($fp, LOCK_UN);
@fclose($fp);
return $stringlen;
}
}
?>
[/php]
2,写缓存和读取的示例
[php]
<?php
//写缓存
include "func.inc.php";
$arr = array (1, 2, array ("a", "b", "c"));
cache_write('test.cache.php', $arr); //缓存文件 test.cache.php
?>
[/php]
[php]
<?php
//读缓存
include "func.inc.php";
$var = cache_read('test.cache.php');
print_r($new_var);
print_r($var);
foreach ($var as $k=>$v)
{
echo '<br>' . $k . '=' . $v ;
}
?>
[/php]
3,性能分析
缓存之所以能提高性能,是通过本地磁盘空间换网络存取速度和数据库服务器存取时间的结果。
a = 本机读写时间
b = 本机占用空间
c = 网络传输时间
d = 数据库服务器磁盘时间
可以估算到,如果数据库与应用程序存在于一台机器时,主要是 a 与 d 的比较,效果可能并不明显,甚至还要糟一点。因为数据库系统针对磁盘存取经过了精心优化,是操作系统对文件的普通读写无法相比的。
如果本机的磁盘存取效率不佳,有时从局域网的数据库上取得数据,可能比从本机的缓存取数据还快,这种情况比较少见。而随着请求数量的大量增加,缓存的效果就会明显起来。
觉得很不错,所以推荐一下。
<?php
header("Content-type: text/html;charset=GBK");//输出编码,避免中文乱码
require_once(dirname(__FILE__)."/include/config_base.php");
require_once(dirname(__FILE__)."/include/inc_type.php");
require_once(dirname(__FILE__)."/include/inc_cache.php");
$fatherid="";
$fatherid=$_GET['fatherid'];
if(!empty($fatherid)){
if(!file_exists('/cache/sun_'.$fatherid.'_cache.txt')){
$ty = new Type(0);
$typeOptions = $ty->GetSmallOption($fatherid);
if(!empty($typeOptions)){
cache_write('/cache/sun_'.$fatherid.'_cache.txt', $typeOptions);
echo "<select name='sunid' style='width:200'>rn";
echo $typeOptions;
echo "</select>";
$tl->Close();
}
}else{
$typeOptions=cache_get('/cache/sun_'.$fatherid.'_cache.txt');
echo "<select name='sunid' style='width:200'>rn";
echo $typeOptions;
echo "</select>";
}
}
?>
<div id="BigType">
</div>
<div id="SmallType">
</div>
<script language="JavaScript" src="prototype-1.6.0.2.js"></script>
<script>
function GetBigType (){
var url='GetBigType.php';
var pars='pid=1';
var myAjax=new Ajax.Updater('BigType', url, {method:'get', parameters:pars});
}
GetBigType ();
function GetSmallType(){
var fatherid=$F('fatherid');
var url=' GetSmallType.php';
var pars='fatherid='+fatherid;
var myAjax =new Ajax.Updater('SmallType', url, {method:'get', parameters:pars});
}
</script>
<?php
header("Content-type: text/html;charset=GBK");//输出编码,避免中文乱码
require_once(dirname(__FILE__)."/include/config_base.php");
require_once(dirname(__FILE__)."/include/inc_type.php");
require_once(dirname(__FILE__)."/include/inc_cache.php");
$pid="";
$pid=$_GET['pid'];
if($pid==1){
if(!file_exists('../cache/bigtype.cache.txt')){
$ty = new Type(0);
$typeOptions = $ty->GetBigOption();
cache_write('/cache/bigtype.cache.txt', $typeOptions);
echo "<select name='fatherid' onChange='GetSmallType();' style='width:200;'>rn";
echo "<option value='0' selected>--不限栏目--</option>rn";
echo $typeOptions;
echo "</select>";
$ty->Close();
}else{
$typeOptions=cache_get('/cache/bigtype.cache.txt');
echo "<select name='fatherid' onChange='GetSmallType ();' style='width:200;'>rn";
echo "<option value='0' selected>--不限栏目--</option>rn";
echo $typeOptions;
echo "</select>";
}
}
?>
好了我们来看看用php自带的ftp函数做的文件上传吧,上传文件我们会用到ftp_put把文件传送到服务器下面有两个上传的简单实例。代码如下 | 复制代码 |
<?php <?php // 连接FTP服务器www.111cn.net/ // 上传文件 // 关闭FTP连接 |
转载请注明www.111cn.net/phper/php.html
相关文章
- 这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
这篇文章主要介绍了基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23- 这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
如何在Spring WebFlux的任何地方获取Request对象
这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作
只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30- js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下: fu...2015-10-21
- 在本篇内容里小编给大家分享的是关于c#使用封装方法以及相关知识点,对此有需要的朋友们可以学习下。...2020-06-25
- 本文给大家介绍如何替换json对象中的key,通过实例代码给大家介绍key的替换方法,代码也很简单,需要的朋友参考下吧...2021-06-02
- 这篇文章主要介绍了javascript self对象使用详解的相关资料,需要的朋友可以参考下...2016-10-20
- 这篇文章主要介绍了vue+element-ui表格封装tag标签使用插槽,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-19
- 这篇文章主要介绍了vue 将多个过滤器封装到一个文件中实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2020-09-05
- 这篇文章主要介绍了Vue封装全局过滤器Filters的步骤,通过封装vue全局过滤器实现filters的统一管理。感兴趣的朋友可以了解下...2020-09-16
- 这篇文章主要为大家详细介绍了原生JS封装Ajax插件,为大家介绍不同域之间互相请求资源的跨域...2016-05-05
- 这篇文章主要介绍了封装 axios+promise通用请求函数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD
vbs调用插件报:ActiveX部件不能创建对象,代码:800A01AD,一般是因为病毒导致dll文件丢失或者64系统问题导致,需要的朋友可以参考下...2020-06-30- 这篇文章主要为大家介绍了JavaScript事件对象,了解JavaScript事件...2016-01-26
- 在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件。本文给大家介绍Bootstrap媒体对象的实现,感兴趣的朋友一起学习吧...2016-05-04
- 这篇文章主要介绍了Xml中使用foreach遍历对象实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-04
- vue项目经常会用到axios来请求数据,那么首先肯定需要对这个请求方法进行一个二次封装,这篇文章主要给大家介绍了关于项目中Axios二次封装的相关资料,需要的朋友可以参考下...2021-06-08