PHP多态性入门学习笔记与例子

 更新时间:2016年11月25日 16:17  点击:2127
对于PHP多态大在学时后面的教程没人教自己也没有看懂,在实际应用中PHP多态用到也是非常的少了,下面整理了一篇关于PHP多态的例子。


多态这个概念,在Java中指的是变量可以指向的对象的类型,可是变量声明类型的子类。对象一旦创建,它的类型是不变的,多态的是变量。
在PHP5中,变量的类型是不确定的,一个变量可以指向任何类型的数值、字符串、对象、资源等。我们无法说PHP5中多态的是变量。


我们只能说在PHP5中,多态应用在方法参数的类型提示位置。
一个类的任何子类对象都可以满足以当前类型作为类型提示的类型要求。所有实现这个接口的类,都可以满足以接口类型作为类型提示的方法参数要求,通俗来讲多态就是指同一东西的多种表现形式;

看如下代码:

 

abstract class A{    
    public abstract function abc();
}
 
class AB extends A{
    public function abc(){
        echo 'ab';
    }
}
 
class AC extends A{
    public function abc(){
        echo 'ac';
    }
}
 
class T{
    public function abc(){
        echo 't'
    }
}
 
class Client{
    public static function call(A $obj){
        $obj->abc();
    }
}
 
Client::call(new AB());//ab
Client::call(new AC());//ac
Client::call(new T()); //error  Client类的方法应该为   public static function call($obj){      $obj->climb();   }
 

如我们创建一个doing()方法,如果是学生则打印上课,如是公司职员则打印上班。

普通做法

使用if判断

/**
 * PHP多态性
 * 琼台博客
 */
 
// 定义学生类
class student{
    public function cla(){
            echo "学生工正在上课!<br />";
    }
}
 
// 定义职员类
class office{                              
        public function Wor(){
            echo "职员正在上班!<br />";
        }
}
 
// 判断对象类型方法
function doing($obj){ 
        if($obj instanceof student){ 
            $obj->cla();
        }elseif($obj instanceof office){
            $obj->wor();
        }else{
            echo "没有这个对象!";
        }
}
 
doing(new student()); // 学生正在上课
doing(new office());  // 职员正在上班

以上结果输出:

学生正在上课

职员正在上班

这种普通方法有个缺点,就是对象如果很多,那么if..else..很长,不灵活。

 

多态性做法
定义一个公共抽象方法,所有子类继承它。

/**
 * PHP多态性
 * 琼台博客
 */
 
// 定义一个公共类
class pub{
    protected function working(){
        echo "本方法需要在子类中重载!";
    }
}
 
// 定义学生类,继承公共类pub
class student extends pub{
    public function working(){
        echo "学生工正在上课!<br />";
    }
}
 
// 定义职员类,继承公共类pub
class office extends pub{
        public function working(){
        echo "职员正在上班!<br />";
        }
}
 
// 判断对象类型方法
function doing($obj){ 
        if($obj instanceof pub){ 
            $obj->working();
        }else{
            echo "没有这个对象!";
        }
}
 
doing(new student()); // 学生正在上课
doing(new office());  // 职员正在上班

这就是多态的特性,灵活重用。


其它做法

从多态性的实现方式来看,无非就规范了每个类都要重载父类的一个方法,从而达到统一效果。而我们在定义类的时候,自行加上统一的方法也可行。因此以上例子也可以这么实现:
/**
 * PHP多态性
 * 琼台博客
 */
 
// 定义学生类
class student{
    // 定义统一的方法pub
    public function pub(){
        echo "学生工正在上课!<br />";
    }
}
 
// 定义职员类
class office{
    // 定义统一的方法pub
        public function pub(){
        echo "职员正在上班!<br />";
        }
}
 
// 判断对象类型方法
function doing($obj){ 
    if($obj){
        // 调用类的统一方法
            $obj->pub();
    }else{
        echo '没有这个对象';  
    }
}
 
doing(new student()); // 学生正在上课
doing(new office());  // 职员正在上班

当然,以上的例子不能说明多态性就能使用这样的方式搞定,毕竟多态性在复杂的程序设计中,它能有效的达到灵活重用的特性。

多态性也可以理解为一种程序设计方式,而程序设计最终目的无非就是:灵活,多态,重用,高效。

微信红包的原因就是通过指定的标识获得商户的信息然后进行发红包了,这个功能不简单并且要申请与验证和操作都非常的麻烦了,下面来看看微信红包api接口开发例子。

人工手动发放

商户在已经获知要发送的用户的openid情况下,可以将openid编辑成txt文件,直接登录微信支付商户平台,同样在“资金管理-现金管理”中充值后,创建要发放的红包,并填写金额等相关信息,再根据指引操作即可。

系统自动发放

商户需先发送邮件至wxhongbao@tencent.com获取流程指引,再登录商户平台(pay.weixin.qq.com ),在“资金管理-现金管理”中充值;然后即可自行根据开发文档进行开发,并发放现金红包,我们重点讲系统发布。

首先,商户调用微信红包接口时,服务器会进行证书验证,所以要在商户平台下载证书。在管理后台的“账户信息”里找到“安全设置”就可以下载了证书了。

微信平台红包开启教程

接着就是向帐号中充值,因为发放现金红包将扣除商户的可用余额,所以需要预先充值,确保可用余额充足。进入“资金管理”菜单找到“现金管理”,在此进行充值,保证帐号有余额可以进行红包发放。

微信平台红包开启教程

 

 

根据微信高级红包接口,开发PHP版本的API接口,现在进行主要代码分析

红包接口调用请求代码,所有请求参数为必填参数与文档对应:
class Wxapi {
    private $app_id = 'wxXXXXXXXXXXXX'; //公众账号appid,首先申请与之配套的公众账号
    private $app_secret = 'XXXXXXXXXXXXXXXXXXXXXXXX';//公众号secret,用户获取用户授权token
    private $app_mchid = 'XXXXXXXX';//商户号id
    function __construct(){
    //do sth here....
    }
    /**
     * 微信支付
     * @param string $openid 用户openid
     */
    public function pay($re_openid)
    {
        include_once('WxHongBaoHelper.php');
        $commonUtil = new CommonUtil();
        $wxHongBaoHelper = new WxHongBaoHelper();
        $wxHongBaoHelper->setParameter("nonce_str", $this->great_rand());//随机字符串,丌长于 32 位
        $wxHongBaoHelper->setParameter("mch_billno", $this->app_mchid.date('YmdHis').rand(1000, 9999));//订单号
        $wxHongBaoHelper->setParameter("mch_id", $this->app_mchid);//商户号
        $wxHongBaoHelper->setParameter("wxappid", $this->app_id);
        $wxHongBaoHelper->setParameter("nick_name", '红包');//提供方名称
        $wxHongBaoHelper->setParameter("send_name", '红包');//红包发送者名称
        $wxHongBaoHelper->setParameter("re_openid", $re_openid);//相对于医脉互通的openid
        $wxHongBaoHelper->setParameter("total_amount", 100);//付款金额,单位分
        $wxHongBaoHelper->setParameter("min_value", 100);//最小红包金额,单位分
        $wxHongBaoHelper->setParameter("max_value", 100);//最大红包金额,单位分
        $wxHongBaoHelper->setParameter("total_num", 1);//红包?Х抛苋耸?br />         $wxHongBaoHelper->setParameter("wishing", '感谢您参与红包派发活动,祝您新年快乐!');//红包祝福诧
        $wxHongBaoHelper->setParameter("client_ip", '127.0.0.1');//调用接口的机器 Ip 地址
        $wxHongBaoHelper->setParameter("act_name", '红包活动');//活劢名称
        $wxHongBaoHelper->setParameter("remark", '快来抢!');//备注信息
        $postXml = $wxHongBaoHelper->create_hongbao_xml();
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
        $responseXml = $wxHongBaoHelper->curl_post_ssl($url, $postXml);
        //用作结果调试输出
        //echo htmlentities($responseXml,ENT_COMPAT,'UTF-8');
    $responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
    return $responseObj->return_code;
    }
获取随机字符串方法:

/**
 * 生成随机数
 */    
public function great_rand(){
    $str = '1234567890abcdefghijklmnopqrstuvwxyz';
    for($i=0;$i<30;$i++){
        $j=rand(0,35);
        $t1 .= $str[$j];
    }
    return $t1;   
}
签名算法:


/**
例如:
appid:    wxd111665abv58f4f
mch_id:    10000100
device_info:  1000
Body:    test
nonce_str:  ibuaiVcKdpRxkhJA
第一步:对参数按照 key=value 的格式,并按照参数名 ASCII 字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i
d=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接支付密钥:
stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A
9CF3B7"
*/
protected function get_sign(){
    define('PARTNERKEY',"QSRXXXXXXXXXXXXXXXXXXXXX");
    try {
        if (null == PARTNERKEY || "" == PARTNERKEY ) {
           throw new SDKRuntimeException("密钥不能为空!" . "<br>");
        }
        if($this->check_sign_parameters() == false) {   //检查生成签名参数
           throw new SDKRuntimeException("生成签名参数缺失!" . "<br>");
        }
        $commonUtil = new CommonUtil();
        ksort($this->parameters);
        $unSignParaString = $commonUtil->formatQueryParaMap($this->parameters, false);
        $md5SignUtil = new MD5SignUtil();
        return $md5SignUtil->sign($unSignParaString,$commonUtil->trimString(PARTNERKEY));
    }catch (SDKRuntimeException $e)
    {
        die($e->errorMessage());
    }
 
}
CURL请求以及发送证书:

function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
{
    $ch = curl_init();
    //超时时间
    curl_setopt($ch,CURLOPT_TIMEOUT,$second);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
    //这里设置代理,如果有的话
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);    
    //cert 与 key 分别属于两个.pem文件
    //请确保您的libcurl版本是否支持双向认证,版本高于7.20.1
    curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_cert.pem');
    curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_key.pem');
    curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'rootca.pem');
    if( count($aHeader) >= 1 ){
        curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
    }
    curl_setopt($ch,CURLOPT_POST, 1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
    $data = curl_exec($ch);
    if($data){
        curl_close($ch);
        return $data;
    }
    else {
        $error = curl_errno($ch);
        //echo "call faild, errorCode:$error\n";
        curl_close($ch);
        return false;
    }
}

入口文件:


@require "pay.php";
//获取用户信息
$get = $_GET['param'];
$code = $_GET['code'];
//判断code是否存在
if($get=='access_token' && !empty($code)){
    $param['param'] = 'access_token';
    $param['code'] = $code;
    $packet = new Packet();
    //获取用户openid信息
    $userinfo = $packet->_route('userinfo',$param);
    if(empty($userinfo['openid'])){
        exit("NOAUTH");
    }
    //调取支付方法
    $packet->_route('wxpacket',array('openid'=>$userinfo['openid']));
}else{
    $packet->_route('userinfo');
}

开发所需文档:

1)官方红包高级接口文档

2)官方公众平台获取用户基本信息接口文档

3)商户平台开发文档

本文是我们总结的在Drupal开发中,一键隐藏管理导航相关模块及站内键盘导航相关模块,希望对drupal感兴趣的朋友有所帮助。

一键隐藏管理导航相关模块

在我们平时做项目时一般必装一个管理导航,要么是内置的Toolbar,要么是老牌的Administration menu,要么就是新贵Navbar,因为管理员总是需要这个东西,开发者有时也很需要。但其带来便利的同时,也在屏幕上占了一块地方,所以有时我们或者客户需要隐藏他们,在需要的时候再通过快捷键呼出。

这个需求Drupal社区中也给我们提供了解决方法,本文列出几个备选项,有此需求的朋友可以试试看。

Admin Toggle


Admin Toggle模块旨在隐藏一些页面元素使得管理员可以在管理员视角和匿名用户视角来回切换,在这个背景下,这个模块首先就实现了对Toolbar或Administration menu的隐藏,同时还可以隐藏一些管理区块,比如Devel模块那个。

Admin Menu Hider

Admin Menu Hider模块通过快捷键可以控制Administration menu的显式和隐藏,类似的模块是Toolbar Hider。

Toolbar Hider


htt<a href=

Toolbar Hider模块提供了一个很有意思的功能,就是通过快捷键控制Drupal7的Toolbar的显示和隐藏,有时候管理员也不希望总看到Toolbar,所以这个模块对管理员来说也挺有用的。



站内键盘导航相关模块


站内键盘导航这个需求在网站上用的比较少,但是如果你是一个Mac用户,你一定知道Spotlight,或者Alfred。这个功能实际体验的话,真的很方便。

Drupal社区竟然有这样的模块,而且有的做的相当不错,推荐大家试试,本站比较推荐第一个。

Coffee


Coffee模块是一个用于管理员通过键盘在网站进行快速导航的工具模块,类似于 Mac 上的 Alfred (link is external) 和 Spotlight (link is external)。

EazyLaunch


EazyLaunch模块是一个快速的基于文本输入的启动器,用于快速地在整个菜单系统中导航,任何页面只需按Ctrl+Z即可调出输入框,输入关键字时还可以给出提示。

特性:

Teleport


Teleport模块是一个键盘快捷导航模块,只支持Drupal6,灵感来自于Quicksilver和Gnome Do。

快捷键是ctrl+m,输入路径或者路径标题关键字定位,可以直接提交,如果不是一个完整路径,模块会自己猜测你可能想去的地方。

Cobalt


Cobalt模块是一个快捷键盘导航模块,类似于Gnome Do或者Mac下的Quicksilver。你可以搜索路径关键字,支持中英文,支持多种浏览器。

触发的键盘快捷键是alt+空格。


Stream其实是一个抽象的概念,类似于传输层,位于文件系统的下层。php本身是支付StreamWrapper的,不过Drupal对其进行完善,本文我们来看看底层File System和Stream Wrapper的原理。

在Drupal7以及PHP(也不知那个版本)后,多了一个概念:Stream,主要用来表示文件流。BTW,追溯起Stream的概念,这个应该很早在Java和C#等OOP的语言中已存在,PHP只是简单的封装了file/file_get_content等函数,使用起来方便,所以PHPer 们更少的在意stream以及整个底层的操作。

当我们使用一个完整的框架(如:drupal框架),drupal又更加完善了PHP中stream的概念和使用方式,使其更加OO,更加易用。

注意:PHP本身是支持StreamWrapper的,Drupal只是对其进行完善,因此PHP的函数,如move、 fopen、move_uploaded_file等函数是直接可以用scheme的形式访问(类似php://的形式),在PHP中增加一个 streamwrapper需要注册一个,需要调用stream_wrapper_register函数。

详情参考: http://php.net/..class.streamwrapper.php

Stream是什么?

Stream其实是一个抽象的概念,类似于传输层,位于文件系统的下层。跟Stream相连的就是存储,也就是Stream相当于一传输线,一端连接存储,一端连接程序。


File的操作

文件的操作基本就是读写,读写的位置其实就是stream,一般情况下读写本地文件,我们认为也是一个stream,可以认为 LocalFileStream,读写网络文件(FTP、HTTP、S3、阿里OSS、NFF等)也是一种stream,这样看来,文件的操作API其实应该是一个抽象的函数,而不是一个具体的函数。

用数据库作为类比,数据的open、prepare、update、execute、close就是有一个抽象的类,后端用什么数据库,就有对应的实现,参考下面的图片:


db-abstract-layer-files

程序调用数据库的抽象接口,该接口根据数据库的url,按照不同的scheme返回不同的数据库操作类,完成对数据库的操作。

因此文件的操作,我们用数据库操作做对比,也可以用下图来表示:


file-abstract-layer

通过上图,我们就可以理解,其实对文件的操作就是对流的操作,不同的流对应不同的存储介质,只是默认情况下,我们认为流就是本地文件,但是随着存储的日益复杂和云的兴起,对文件的操作已不能简单的理解为对本地文件的操作,而应该是对流(Stream)的操作。

因此,在其他语言里面stream是一个基类,根据不同的存储介质,stream有不同的实现,比如C#中的stream的集成关系如下,通过OO的方式,更好的理解stream的概念。


C# Stream

Drupal中File API和Stream Wrapper

一图顶万言,综合上面的理解,我们做了下面这张关系图,虽然不一定准确,但是可以帮助我们理解Drupal中file和stream wrapper的关系。


drupal file system and  streamwrapper

Drupal的stream wrapper只是一个接口,可以实现任意的自定义stream wrapper。

Drupal的第三方stream wrapper:

Remote stream wrapper(http://、https://、feeds://)

https://www.drupal.org/project/remote_stream_wrapper

System stream wrapper (module://、theme://、profile://、library://)

https://www.drupal.org/project/system_stream_wrapper

因此,标准化的File操作,需要传进去一个带有scheme的path,在PHP中,默认的不带scheme就是本地文件。在Drupal中,默认的scheme是public,也是是本地文件的public目录。

StorageAPI 模块

Drupal中也许对上面的逻辑坐得不够完善,或许抽象层不是很完美,因此storageAPI模块出现了,它扩展的标准的Drupal文件操作,即使你对Drupal的file和stream不懂,装上这个模块,加上对应的service就能实现上图对云文件的操作。 如Amazon S3、Ftp、database等。

(笔者看来,StorageAPI就是对上面图中文件访问结构图中逻辑的实现和完善)

当然这个模块也有缺陷,那就是跟某些第三方模块的兼容的问题,并不是所有模块都能良好的兼容storage api模块,这个也是drupal第三方模块的同病。

注意,要启用drupal文件对storageAPI的支持,需要启用Core Bridge 模块。

StorageAPI模块参考 https://drupal.org/project/storage_api

Storage api stream wrapper :https://www.drupal.org/project/storage_api_stream_wrapper

后记

回顾第一段,PHP内部支持StreamWrapper,在Drupal中,对PHP的StreamWrapper进行了扩展,主要的Interface是:DrupalStreamWrapperInterface

Drupal本身通过这个Interface实现了DrupalLocalStreamWrapper,第三方模块实现了很多,如下:

HPCloud: HPCloudDrupalStreamWrapper

Storage API: StorageApiStreamWrapper

Storage Core Bridge: DrupalStorageStreamWrapper


用Drupal如何做一个邮件订阅推送系统? 本文我们将提供解决方案,用drupal搭建一个邮件推送系统,实现用户订阅邮件的发送。

电子邮件营销称为EDM,即Email Direct Marketing的缩写,是在用户事先许可的前提下,通过电子邮件的方式向目标用户传递价值信息的一种网络营销手段。邮件推送是跟用户互动最有效的手段之一,因此任何一个平台,需要跟用户交流,邮件推送系统是必不可少的一个环节。

本文主要讲解如何用drupal搭建一个邮件推送系统,实现用户订阅邮件的发送。


email-drupal

本文参考: http://www.wdtutorials.com/…

第一步,安装模块Simplenews、MailSystem、HTMLMail。

Simplenews是邮件管理发送的核心模块,启用simplenews就可以有一种内容类型,用来创建新的newsletter,MailSystem和HTMLMail,是设置邮件输出内容以及格式用的。

第二步,创建Newsletter。

A. 设置一个测试邮箱(Test Address)admin/config/services/simplenews/settings

B. 创建Newsletter node/add/simplenews

C. 创建完成之后,到newsletter的tab,点击发送测试

设置测试邮件地址截图:


设置测试邮件地址

这时候,我们可以到测试邮箱地址查看是否收到了此邮件(涉及本地的sendmail系统和收件箱是否屏蔽垃圾邮件)。

这样两步就完成了一个基本的邮件管理和发送,注意这里的发送用的是Sendmail,也就是系统自带的发送邮件程序,稍微我们讲解如何替换。

第三步,Simplenews高级设置。

a. 默认设置

admin/config/services/simplenews/settings

有很多设置点:默认的format,测试收件箱、发送者、确认邮件的模板、cron发件数量等

b. 创建simplenews分类,然后在具体分类里面设置邮件发送配置

admin/config/services/simplenews

第四步,系统邮件设置 ? drupal Mail System

a. admin/config/system/mailsystem

NEW SETTING 里面选择 simplenews,点击保存。

b. MAIL SYSTEM SETTINGS 里面会有一个 Simplenews module class,选择HTMLMailSystem,点击保存。

给Simplenews模块添加邮件截图:


mailsystem_class

保存之后,给Simplenews选择邮件处理模块:


mailsystem_simplenews

第五步. 邮件输出:HTMLMail的模板和Simplenews的Formatter

a. HTML Mail基础设置

admin/config/system/htmlmail

step 1 查看tpl文件和debug属性

step 2 选择使用的theme,选择一个简单theme或者当前theme即可。

注意,这个theme决定了htmlmail模板需要放置的位置。

step 3 输出formatter设置。

推荐新建一个formatter用于newsletter,安装几个推荐filter,比如Emogrifier。

b. simplenews的输出格式(都选择HTML)

默认的formatter在: admin/config/services/simplenews/settings

具体simplenews分类的formatter在: admin/config/services/simplenews

如果分类里面设置为HTML格式,不成功,那就再把默认的formmater也设置为HTML

到这里,就可以测试发送邮件的效果了,看看邮件格式是否正确。

关于邮件的内容正文和内容类型设置有两种方式:

1. 通过Node的body,发不出来的跟邮件的内容同一个body。

2. 通过自定义的Field,然后在tpl里面拼装,不同的用于显示结果不一样。

需要注意的问题:

Simplenews的相关模板的tpl具体在simplenews下面,需要复制到theme下面的话,一般是seven(自己测试一下为什么放到当前theme下不行),所以,推荐直接修改simplenews模块下面的tpl。

HTMLMail的相关tpl主要作用是包装simplenews,把htmlmail?simplenews.tpl.php文件复制到指定的 theme或当前theme下面(这个theme可以在htmlmail模块里设置),然后可以在htmlmail-body标签外面包装自己想要的信息即可。

HTMLMail的tpl可以用于邮件的头尾信息的包装,比如邮件的头部的logo,尾部的版权信息等。

步骤六,邮件的订阅人管理地址: admin/people/simplenews

步骤七,使用Cron发送: admin/config/services/simplenews/settings/mail


sendmail_cron

设置完成上面的步骤,一个简单的邮件推送系统就搭建完成了,Drupal里面主要还是管理邮件内容和推送用户信息、订阅等信息,真正的发送邮件还是系统的sendmail,如果需要更高效的发送,可以安装postfix。考虑到邮件的认证、域名反向解析、spf以及垃圾邮件处理,可以考虑使用第三方的发送系统,这个时候,我们可以安装Drupal的SMTP模块即可。


[!--infotagslink--]

相关文章

  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • photoshop画斜线/直线/虚线的入门级教程

    这篇文章算是超级入门级别的了,我们下面来给各位介绍在photoshop画斜线/直线/虚线的教程了,希望下面这篇文章给你入门来帮助。 PS怎么画斜线 选择铅笔工具,或者画笔...2016-09-14
  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • 20分钟MySQL基础入门

    这篇文章主要为大家分享了20分钟MySQL基础入门教程,快速掌握MySQL基础知识,真正了解MySQL,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-12-02
  • php Observer观察者模式之学习笔记

    当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
  • PHP 日期函数 学习笔记介绍

    举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
  • C#使用虚拟方法实现多态

    这篇文章主要介绍了C#使用虚拟方法实现多态,涉及C#多态的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 详解Servlet入门级设置(超详细 IDEA2020版)

    这篇文章主要介绍了详解Servlet入门级设置(超详细 IDEA2020版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-04
  • php入门教程(类实例教程)

    这里主要讲到关于在php教程类的调用,申请明,使用以前各种类的实例方法与操作过程,让你清楚的知道php类的construct destruct clone call wake sleep用法。 简单购物车...2016-11-25
  • MySQL的InnoDB引擎入门学习教程

    MySQL发展到今天,InnoDB引擎已经作为绝对的主力,除了像大数据量分析等比较特殊领域需求外,它适用于众多场景。然而,仍有不少开发者还在“执迷不悟”的使用MyISAM引擎,觉得对InnoDB无法把握好,还是MyISAM简单省事,还能支持快...2015-11-24
  • Android学习笔记之多界面切换实例

    一篇Android学习笔记之多界面切换实例,希望对各位朋友有所帮助。 用过VB 、 VC#的朋友都知道,在VB或VC#里要进行窗口(界面)切换很容易 例如在VB、C#里: 有 Fom1、...2016-09-20
  • 阿里云ECS服务器入门使用流程(新手必看教程)

    这篇文章主要介绍了阿里云ECS服务器入门使用流程(新手必看教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-13
  • php中的变量引用传值学习笔记

    引用:意思是将原始对象在内存中的地址传递给目标对象,就相当于原始对象和目标对象指向的是同一个内存地址。此时,如果对目标对象或者原始对象进行修改,内存中的数据也会改...2016-11-25
  • php入门级教程:PHP大小写问题

    PHP大小写问题算是一个入门级的教程了,在此小编为php初学者介绍php开发中大小写的一些例子,希望可以帮助到各位。 今天写代码的时候发现自己代码的一处错误: $m_cate...2016-11-25
  • 一篇文章带你了解C语言:入门基础(2)

    这篇文章主要介绍了C语言入门之基础知识详解,文中有非常详细的C语言使用教程及相关基础知识,对正在学习c语言的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-08-04
  • PHP中的cURL请求及示例学习笔记

    cURL是php中一个很强大的功能,可以模仿各种用户请求,如模仿用户登录,发送php cookie等等操作,下面我来整理一些相关的方法与各位同学看看 备注:使用curl_init函数,必须...2016-11-25
  • Springboot入门案例及部署项目的详细过程

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,本文给大家分享一个入门案例使用Springboot1.5.9搭建,具体配置部署过程跟随小编一起看看吧...2021-07-12
  • 一篇入门的 Class 文章

    刚在大略浏览了一下首页更新的那篇有关Class的文章(指PHPE的那篇 http://www.phpe.net/articles/389.shtml ),很不错,建议看看。 对类的摸索~~俺用了半年时间才大概理解类的...2016-11-25
  • 那些年,我还在学习C# 学习笔记

    那些年学了ASP.NET后,才开始学习C#,说来也怪,怎么学了ASP.NET才来学习C#,其实没有什么的...2020-06-25