php 获取一个月第一天与最后一天的代码


-
复制代码 代码如下:function getthemonth($date) { $firstday = date(‘Y-m-01’, strtotime($date)); $lastday = date(‘Y-m-d’, strtotime(“$firstday +1 month -1 day”)); return array($firstday, $lastday); } 您可能感兴趣的文章:用php获取本周,上周,本月,上月,本季度日期的代码PHP显示今天、今月、上月、今年的起点/终点时间戳的代码PHP实现针对日期,月数,天数,周数,小时,
15KB
php 获取一个月第一天与最后一天的代码
2020-10-29php获取一个月第一天与最后一天直接上代码,其实是个很简单的东东
24KB
PHP获取本周第一天和最后一天示例代码
2020-10-26主要介绍了PHP获取本周第一天和最后一天的方法,需要的朋友可以参考下
4KB
微信App 支付 PHP后台接口代码
2018-07-19微信 支付这 官方文档 很乱 写的 也不是很清楚,测试时 一定要与安卓 或 苹果端 一起测试。 否则 根本找不到问题。 废话 不过说 先 说说 几大坑的地方。我也是 借鉴 别人的 博客 才测试成功调起支付。文章后 直接上代码 代码 绝对能调起 微信 测试过的! 第一步,生成prepayid,这一步,只要你的appid,mch_id,key没写错,那么99%以上都能获取到prepayid,如果失败,那肯定是几个ID和key有问题,仔细检查,包括编码等,仔细仔细仔细检查。 问题来了,第二步,对获取到的prepayid进行二次签名,官方文档的坑来了,官方并没有详细说明这一步骤,一切的一切只能靠自己摸索,爬坑。 首先第一坑:参数顺序,我这里用了SortedMap,自动对参数进行asc编码顺序,一劳永逸,当然,也可以用其他map,但一定要注意参数顺序,必须是asc编码顺序。 第二坑:参数package的Sign=WXPay中=的编码问题,转码即可,小坑。 第三坑:苹果系统的timestamp位数,统一成10位即可,小坑。 第四坑:次级大坑,注意,官方文档说到的参与二次签名的参数,prepayId,appId,timeStamp等,如果你用他们的驼峰进行大写,那么你就完了。一定要小写,小写,小写。 第五坑:最大坑,一样,官方文档并没有对于二次签名有过多赘述,如果你上面几个坑完美出坑,那么,你获取到的签名sign跟官方验证的sign绝对是一样的,然而,将这些玩意丢回给APP,APP调起支付,大大的几个字出现了,验证签名失败!WTF!不要急,我已折腾了好几天,终于发现坑在哪里,那就是noncestr随机字符串,参与二次签名的随机字符串不能再次生成,注意,不能再次生成,一定要用第一步中获取prepayid时的那串字符串,一定要用第一步中获取prepayid时的那串字符串,一定要用第一步中获取prepayid时的那串字符串。 第六坑:经历了上述5坑,相信你已经有想干死人的冲动,那么你以为这就结束了吗,还有最后一坑,那就是APP签名已经包名,一定要与开放平台中的一致,然而,即使一致了你以为又结束了吗,NO,如果你更改过开放平台中的签名,并且,在更改前调用过APP微信支付,那么一定一定一定一定记得清除微信缓存。 至此,所有坑都成功出坑,终于出现了支付页面,举国欢腾,微信去年买了个表。最后附上MD5签名类
25KB
php根据年月获取季度的方法
2020-12-19复制代码 代码如下:<?phpfunction getQuarterByMonth($date){ $month = substr($date,-2); $Q = ceil($month/3); return $Q;}?> 您可能感兴趣的文章:C#巧用DateTime预设可选的日期范围(如本年度、本季度、本月等)实现一个年、月、季度联动SELECT的javascript代码JavaScript获取某年某月的最后一天附截图JS获取月的最后一天与JS得到一个月份最大天数的实例代码js获取当月最后一天实例代码js获取当前月的第一天和最后一天的小例子js
26KB
PHP获取指定月份第一天和最后一天的方法
2021-01-20本文实例讲述了PHP获取指定月份第一天和最后一天的方法。分享给大家供大家参考。具体如下: 复制代码 代码如下:$date = date(time()); $start_date = date(‘Y-m-d’, mktime(00, 00, 00, date(‘m’, strtotime($date))+1, 01)); $end_date = date(‘Y-m-d’, mktime(23, 59, 59, date(‘m’, strtotime($date))+2, 00)); 希望本文所述对大家的php程序设计有所帮助。 您可能感兴趣的文章:
9.16MB
php高级开发教程说明
2008-11-27下载 第1章开发思想 命名是所有事的开始。 要真正掌握一门编程语言,不仅要理解它的语法和语义,更重要的是掌握语言所体现的哲 学思想、语言产生和发展的背景以及设计特点。 1.1 PHP与我 大家是否想过,为什么会有这么多的编程语言?除了所谓“主流语言”例如C、C + +、 P a s c a l等之外,还有其他的如L o g o l、C o b o l、F o r t r a n、S i m u l a和许多更加特殊的语言。当列出一 个项目的梗概时,大多数软件开发者不会真正地考虑到可以使用多种编程语言;他们都有自己 偏爱的语言(也许是公司指定的一种语言),了解它的优点和它的缺点,并根据语言的具体特点 修正项目。但当克服所选语言的缺陷时,就可能会增加不必要的额外工作。 了解如何使用一门语言却缺乏其特定的概念知识,就好像一个开卡车的人想参加二轮马车 比赛一样,当然,一般来讲他应该懂得如何驾驶二轮马车,他甚至可能在终点线上跻身前列, 但他绝不可能成为一个出色的车手,除非他熟悉新车的独特之处。 类似地,当面向对象程序设计( o o p)程序员编写一个应用程序的时候,他会尽力使程序满 足项目要求,处理同一个任务,不同的程序员会运用不同的方式。哪种方式更好?每一个程序 员会说他(她)的方法最好,但只有那些熟悉两种概念—o o p和过程化编程—的人能够作出 判断。 前面提到的每一种语言代表一种解决问题的特定方法,这些问题多属于具有特殊要求的某 一特殊种类。因为这些语言集中在一个有限的应用领域内,他们的成功性也限制在这些领域。 像C和P a s c a l这样的语言变得如此流行,就是因为它们被广泛应用,并且它们不针对特殊问题, 却提供了能很好地解决普遍问题的工具。 那么P H P是如何适应这一体系的呢?尽管它被称之为一种语言,但P H P并不是一种真正独立 的语言,而是许多语言的混和体。它主要用C的句法,但与C有很大不同。它是被解释的, P H P 能识别不同的变量类型,但没有严格的类型检查, P H P识别类,但没有结构体类型,类似的例子 很多,但你可能已领会到了关键一点: P H P融合了许多种不同的解决问题的思想,形成了一种全 新的、独一无二的方法。 为了能够用P H P成功地开发We b应用程序,我们鼓励你首先回答下述问题: P H P是我的项目 所需的理想语言吗?问得好。如果我们说不,那我们就会显得很愚笨(谁会去写一本关于他们 第一部分高级P H P 认为不好的东西的书呢?)。让我们重新阐述这个问题,对项目来说有比P H P更好的语言吗?这 次我们可以很有把握地回答,如果你正在从事网络应用程序的开发, P H P就是为你准备的最好的 语言。 1.2 计划的重要性 你为什么应该阅读这一部分 即使你是一个很熟悉P H P的职业程序员,我们也建议你阅读下面的部分,因为这里包 含了成功开发的基本知识,如果你对所讨论的题目已很熟悉,也应该花时间浏览一下, 你可能会发现新的信息—新的题观点、新的解决方法、新的答案,你对解决未来项目 的不同方面的问题了解得越多,你就能越好地抓住关键点,并且用更好的方式处理。我 们希望你信任我们是职业开发者,并相信我们的经验,这将使你在以后受益。 在深入探讨P H P特定问题之前,先让我们从一个更广泛的观点开始。不论你使用什么语言, 也不论你在什么平台上开发。有一些问题在应用开发中是总会涉及到的。 当从事一个专业项目的时候,考虑一下你正在做什么是至关重要的,“了解你的敌人,永远 不要低估它”。尽管你的项目并不是一个真正的敌人,这句话的寓意仍然适用,在转向其他题目 时,要知道项目的所有技术条件、目标平台、用户,并且决不要低估那些没有考虑周全的小问 题的重要性。 据我们的经验,计划占用了5 0 %的开发时间。项目越大,它的纲要就应该越详尽。这一原则 既适用于同你的顾客相联系并与他们密切合作以确定一个总的项目概要,又适用于与你的开发 者探讨确定一个编码概要。在一致性和可维护性上花的气力越少,就越容易在重新打开旧文件 并设法清除错误或添加新的特征时遇到问题。 计划所用时间与项目大小并不一定成比例,例如,想一下要设计的一个搜索算法。这一应 用程序只需要在一堆信息中进行基本的,搜索并能根据规则抽取数据,由于数据已经存在,所 以创建和输出将不会需要太多的努力。这一应用程序将把它的大部分运行时间花在搜索循环上。 这个循环也许用不了1 0 0行代码,但是为一个优化的循环选择设计一个优化的算法很容易耗费一 整天的时间,这个小小的循环也许是设计阶段最庞大的部分,但另一方面,你可以在不到一天 的时间内策划好数千行的代码。 同样,我们假定需要一个小脚本来列出某个目录中的所有文件,你能够很快地完成它,使 其能从事某一特定任务,在一个特定的目录列出所有文件,不必再担心它了—问题已解决, 可以转向其他任务,把你的程序抛在脑后。但另外一种策略是考虑一下以后的某个时间,甚至 可能是在一个完全不同的项目中—你可能会再一次需要一种类似的工具,仅仅一遍又一遍地 重做目录列举器,每一个对应一个特定的任务,这简直是在浪费时间。因此,当首次遇到这种 情况时,应该考虑到这一点,应从一个目录列举器中创建一个分离的模块,允许它列举不同的 目录,有选择性地递推子目录,甚至允许使用通配符,你可以创建一个“防弹”函数,它即能 处理大多数特例,又能完美地应付一个目录列举器的普通要求。采用这种策略经过几个项目之 后,你将拥有一个工具参数的库,可以安全地重新使用和依赖这个库,从而可以极大地减省开 发时间。 2部分第一部分分高级PHP 下载 当然,有了一个日益增大的免费工具函数库,依然不能满足全部需要,也不能优化这个库 以适应特殊需求,有些库太庞大以致不能随处安装,因为每一次选中都必须分析几百K字节的代 码,这将严重降低站点的性能。在这种情况下,需要用1 0 0 %自己创造的优化解决方案,以取代 非最优解决方案。 更大的项目如果缺乏计划将导致更多的错误,在开发后期,可能会遇到没有或无法预见的 困难,这是由于缺乏计划的时间和工作,这些困难可能会严重到让你彻底地重组整个项目。例 如,对一个依赖额外数据库提取层的数据库支持的应用程序,其数据库提取层仅能接收文本数 据,但后来你发现也需要用它接收数值性的数据,通过工作区转换,可以使它能够接收数值性 数据。但后来你又感觉到这个工作区仍旧不能满足需要,这时唯一能做的就是改变数据库接口, 这需要重构提取层并对所有主代码调用进行检查,当然也需要清除先前创建的工作区。 这样,数小时甚至整天的工作将不得不耗费在本来从一开始就可以避免的问题上,这些问 题往往决定了程序开发的成败,因为“时间是你永远都不可能充分拥有的珍贵资源”。下面的内 容将针对大部分基本的却是非常重要的开发中的实际问题进行讨论:改善代码质量以及基本设 计和文件管理的问题。陈述完这些后,我们创建一个应用程序接口( A P I),采取简单的、实用 的方式使你熟悉这一新的思想,然后我们从头创建一个A P I,在纸上从理论上开发它,并明确一 些实用规则来帮助你实施下一个A P I,例如风格问题、以及商业技巧等。 1.3 编码规范 好的编码和差的编码之间究竟有何区别呢?实际上,这个问题很简单。好的代码(确实好 的代码)能够像一本书一样被阅读。你能从任何地方读起,并且能够时刻意识到你所读的这些 行是干什么用的,它们在什么条件下执行,它们所要求的设置。即使你缺乏背景知识,遇到了 一个错综复杂的算法,你也能很快看出它所从事的任务,以及它的风格。 举个例子,然后说“照着做”总是很容易的,但我想这一章应该使你打下写专业化代码的 坚固基础,这一基础将区分真正精心编制的代码和一个草草完成的程序段。抱歉的是,由于篇 幅所限,我们不能按我们所希望的那样详尽地讨论良好的代码书写风格的每一方面,但本章将 给你一个很好的开始。我们期望你能迅速获得专用的材料,以熟悉软件设计和工程的每一要点。 编码是一个很广的领域,几乎是一门独立的科学。有许多论文论述它,虽然这些论文大多很乏 味,很理论化,但在应用中是不可放弃的。下面我们就最重要的问题进行最基本的讨论。 1.3.1 选择名字 选择变量名可能是程序员最常做、但却想得最少的。如果你已建立了这些在大项目中出现 的变量名字、类型、定义位置的清单,那么你就创建了一个类似于小电话簿的东西,你想让你 的清单成为什么样子呢?不同的命名方案已发展起来了,它们有不同的思想及各自的优点和缺 点,这些方案一般分为两类:简短的变量和函数名及谈话式的变量和函数名(描述变量类型和 目的的更长的名字)。 某个电话目录可能是这个样子的,如表1 - 1所示。 第1章认开发思想部分3 下载 表1-1 电话目录 姓名地址电话 J . D . 3 8 2 W. S -3 9 5 1 M . S . 2 0 4 E . R . -8 3 8 2 这份列表非常有意思:该列表有两个条目,但并没有更多的信息。人名只有首字母,没有 全称;只有房间号,但没有街道名;只有电话号码的一部分,却没有完整的号码。 让我们看另外一个例子,如表1 - 2所示。 表1-2 电话目录 姓名地址电话 h t 5 f t 9 i n a g e 3 2 J o h n 386 West Street,L o s + 1-5 5 5-3 0 4-3 9 5 1 A n g e l e s,C a l i f o r n i a, D o e m a l e m a r r i e d U S A,E a r t h h t 5 f t 6 i n a g e 2 7 M a r y 204 East Road,L o s + 1-5 5 5-3 0 6-8 3 8 2 A n g e l e s,C a l i f o r n i a, S m i t h f e m a l e s i n g l e U S A,E a r t h 在这个例子中,每个人的名字包括身高、年龄、性别及婚姻状况。地址中不但包括街道和 城市,而且也包括州、国家、甚至星球。电话号码附加了国家和地区号。 第二种解决方案比第一种好吗?两个都不是最好的。在程序课上讲授的这两种解决方案, 都不令人满意,定义一种类型t p I n t M y I n t e g e r C o u n t e r,然后声明一个变量i n s t M Y I n t e g e r C y u n t e r I n s t a n c e。如果仅仅需要遍历一个数组并将所有元素都设为0,这无疑显得太冗长了(见 清单1 - 1)。 清单1-1 一个过于冗长的实例 另一方面,使用I、j、k(而不是像$ i n s t M y I n t e g e r C o u n t e r I n s t a n c e这样长的名字)也是不可 接受的,尤其当我们从事的是像压缩这样复杂的缓冲操作的时候更是如此。 这只是普遍思想被误用的一个简单例子,该怎么办?解决的办法是选择好的整体思想,然 后在适当的地方加以例外处理,当写一个应用程序时,应该知道你的代码从事的是什么工作, 能够快速地从一点转到另一点—但其他人可能认为这并不容易。如果你从开发组的某个人手 中获得一个源文件并需要添加一些特征,首先必须对其进行整体把握,并区分代码的各个部分。 理想情况下,这一过程将和阅读源文件平行进行,但由于在没有提示和公共样本帮你理清代码 来阅读的情况下,这是不可能做到的,所以在源代码中包含尽可能多的额外信息,并且使得明 显的事实不易于混淆就显得很重要了。 那么如何能查知这些信息,并将其合并入自己的代码呢? • 使代码更易读。 4部分第一部分分高级PHP 下载 • 如果可能,选择谈话式名字。 • 尽可能添加一些注释。 • 保持清晰、一致的函数接口。 • 把代码结构化成逻辑群。 • 抽出单独代码块。 • 使用文件来将函数分类。 • 编写文档。 下面将讨论上述各主题。 1.3.2 使代码更易读 在阅读的时候,为了理解文章的含义,你的大脑必须分析从你的眼睛里获得的信息,识别 出重要的部分,然后把这些部分译成正确的代码。这个分析过程分两步执行:形式分析和逻辑 分析。首先通过检查文章的可视结构来执行形式分析,例如:检查段落、行、列甚至词之间的 空隙。这一过程打破了对文章的整体了解,将其分成更小块的树形结构。假想一个结构严密的 树,有顶部的树节和底部的树叶,树的顶部包含着最一般的信息,例如,你要读段落顺序,树 的底部是诸如一行中的词序或是一个词中的字母顺序的一些东西。 逻辑分析过程将提取这些形式信息,然后按顺序遍历此树,并设法将信息译成有意义的结 果,这是一种语法上的翻译(这个句子有什么样的结构?),还是一种语境式的翻译(这句话是 什么意思?)在此处讨论中并不重要。重要的是:形式分析的结果越好,逻辑分析就越容易、 越快、越好。 逻辑分析能补偿形式分析中失去的信息,但仅仅是在一个有限的程度上补偿。 你也许能读懂前面的这个句子,但要花费比读本书其他句子更长的时间和更多的注意力, 在第一步分析中,一些重要的信息(间距)丢失了,你并不习惯这样。 我们可以通过添加一些标点使其变得更简单易懂。 标点是进行形式分析的有用信息。注意到阅读这一版本或把注意力集中在所选的任意一点 上要容易得多。下一步: 这是你阅读句子的常规方式,即阅读文章时最习惯的方式,但我们也可用多行结构描述这 个句子: 这是可以让你能尽快地理解这个句子极端的方法的一种,上面的断句阻碍了自然的阅读语 序,因为你并不习惯读一个在句法上被拆成单元的句子,但对于源代码来说,这是一个优势, 第1章认开发思想部分5 下载 因为源代码经常包含复杂的结构、公式等。使源代码保持清晰的外在形式、结构以帮助读者理 解是很重要的,这可以通过使用缩进和在适当的位置放置编程语言的关键词来实现。 让我们看一个简短的P H P程序: 这个代码本身也许并不是智力劳动的精品,我们只观察一下它的结构,如果以前没有读过 这个片段,你能够一下就指出主代码的起始处吗?你能标记出主代码中最初的和最后的说明 吗?即使你能一下子找到想找的地方,你的眼睛也会不由自主的从行首开始从左到右的浏览, 在你认为目标可能在的地方停下来。你的大脑也要重复读这一行,因为你会不时丢失形式分析 得来的信息。为了弥补起步时信息的缺乏,你的大脑(逻辑分析区)也会采取这一步,并强调 两次。正如电脑一样,你的头脑的能力是有限的。所以,当你的大脑确实想要理解和记忆源代 码时,逻辑分析区就在缺乏能力的情况下承担了额外工作。但是理解和记忆恰恰是你想让人们 在读你的源代码时所达到的,也是你在读别人的源代码时想要达到的。 因此,这就是为什么格式化源代码很有用的原因。还有别的原因吗?噢,是的,格式好的 源代码看起来让人赏心悦目。 下面是一些指导原则,其中阐述了我们所认为的在格式化源代码时的最优风格。请注意, 这些指导原则不是强制要求的,但可以认为是一般的规范,许多工业的和开放式的项目已经用 这种方式将源代码格式化了。 并且,采用这种风格经常会带来收益。 • 块标志符( < ?、? >、< ? p h p、< %、% >、{、}等等)要放在不同的行里。 • 用tab 缩进所有的块(理想情况下,把t a b宽度改成不超过4的值)。 • 在关键词和关系对象符之间要留有空隙,特别是在进行计算时尤其要这样做。 • 将代码的逻辑块分别放在连续的行里,使逻辑块分组,并在块之间留有空行。 • 用空行的方式分隔各个块。 • 用空行的方式把函数头、函数脚和代码的其余部分分开(输入全局变量被看作是函数头的一部分)。 • 把每一块的注释并入代码。 • 在同一块内把所有行的注释放置在同样的一些列中。 作为一个例子,清单1 - 2给出了某段格式化的代码。 清单1-2 重新格式化的代码片断 6部分第一部分分高级PHP 下载 大家可以看到,这一小块代码读起来要容易得多。 在代码中,空格的使用可以进一步把参数和关键词分开: 以上看似毫无必要,不过要记住:这些代码要被嵌入几千行代码之中,所以必须改变你的 观点。有些人说在书写源代码文本时,括号之间的空隙与其说有帮助不如说分散了人们的注意 力——我们必须承认,有些时候这是事实,本书中的例子也并不都使用这种格式。我们认为, 是否使用这种格式最后由你自己决定,最重要的则是:要保持一致性。一旦你决定采用某种风 格,就一定要坚持至项目的完成。如果你在修改别人的源代码,你也要尽量遵守他们的风格。 在职业开发中,一致性是最重要的原则之一。 要注意阅读所有源程序的例子,并尽量模仿他们的风格,调整你自己的风格直至和这些最 初的例子很接近为止,一旦你对这种风格很熟悉,你会发现你所做出的努力没有白费。 在进一步阐述之前,我们举两个例子来更好地说明这一点,如图1 - 1和图1 - 2所示。 图1-1 坏的代码 图1 - 1中源代码是要建立一个S Q L语句,除了最后的一行是把一个包含“ select *”的字符串 赋给一个名为$ q u e r y的变量外,我们看不出图1 - 1中还有什么说明了该段代码的目的。与之相反, 在图1 - 2中的代码中,你就比较容易理解代码的所有目的。 第1章认开发思想部分7 下载 图1-2 好的代码 我认为代码就应该是这样,至少应该近似这样,代码应该有清楚的结构、很好的注释,并 且很容易理解。 1.3.3 添加注释 我们无论怎样强调添加注释都不过分,尽管编程时你可能认为这是最微不足道的事情。在 编写高质量的代码时,注释是很重要的。在解决复杂问题的时候,很少有两个人会有完全一样 的想法,某些问题对于一个人可能是一目了然,而对于另外一个人可能是模糊不清的,在这种 情况下,注释就是大有裨益的,只要需要,你都应该把它们添加到代码中。 目前主要有两种注释:头注释(例如文件头注释、模块头或函数头注释)和内部注释。头 注释主要起介绍性作用,告诉读者一个文件要做哪些事情,或下面这一大段代码是关于什么的。 内部注释用在函数内,或嵌入代码中以解释代码的某一行或某一块所做的工作。 下面介绍这些注释的外在感观及其所包含内容的概念。现在,这些注释通常可通过快速应 用开发工具( R A D)或其他授权帮助工具来产生,但由于在撰写本书时仍没有适合P H P的类似 系统,所以这些注释应该是手编的,尽管这会增加一些额外的工作量。 下面按照注释类型的抽象程度,从最抽象的到最具体的来讨论。 保持注释不断更新 要记住在编写函数之中或之前就将其注释好,仅仅为了加注释而读一个文件是非常 令人厌烦的工作。同时,要注意在以后的某个时候如果对进行函数的修改,就要适当地 更新你的注释。例如,若增加或去掉全局变量,那么你也要在注释中对它们的使用注释 进行更新;同样,如果参数顺序、类型等发生变化也是如此。 使用宏来加速你的注释 在你最喜欢的编辑器中,为每一种注释类型创建宏并给它们分配热键(例如,为文 件头分配Ctrl+Alt+Fl,为模块头分配Ctrl+Alt+F2等等)。 8部分第一部分分高级PHP 下载 如果编辑器支持的话,可以把变量引入注释中,这种创建详细的有大量信息的注释 工作就变成了一个创建简短对话框问题。 1. 文件头注释 文件头可以像清单1 - 3那样编排 清单1-3 文件头注释 你可能偏爱使用多行注释创建的对话框,有人认为这样美观(如清单1 - 4所示)。 清单1-4 文件头注释(使用多行注释) 2.在U N I X中提取块注释 在U N I X系统中,下面的g r e p命令从源程序中提取这样的块注释: grep '^[\\\/]*\*' source.php3 选择什么样的风格来格式化你的标题并不重要,但选择的由文件头包含的信息是很重要的。 就像在上面例子中所看到的,标题应该包含一些整体信息,如:关于模块作者等的细节条目要 按一种有意义的顺序放置(例如,包含一个长描述和一个短描述是没有意义的,当读完长描述 后,就已经不再需要短描述了),下面的清单列出了我们所提倡的信息类型及其顺序: 第1章认开发思想部分9 下载 1)模块文件名。 2)短模块描述(一行)。 3)长模块描述。 4)关于用法、要求、警告等的注释。 5)作者的名字和联系信息。 6)模块的创建和最后修改日期。 7)版权注意事项。 8)许可注意事项。 9)转变记录、主页、分配文件等的指针。 1 0)最后,如果需要,变化记录中的摘要。 如果这些听起来太多了,那么记住,宁可有多余的信息,也不要缺乏信息,当然,这并非 在所有范围及所有条件下都合适,我们没有在前述的例子中包含所有情况。然而,你应该设法 向你的标题中放置尽可能多的数据—这是一种良好的习惯。最坏的情况是有些人可能不去读 它,但有可能有些人感激它—也许就是你自己,因为在一个商业化项目中,如果你忽视了版 权和许可注意事项,而当别的程序员免费更新你的代码时,则会导致令人头疼的后果。 3.模块头注释 如果在一个文件中不止一个模块(例如,当某个模块组的一个模块包含三个函数时),应该 在第一个函数前放一个信息量很大的标头。模块头形如清单1 - 5所示。 清单1-5 模块头注释 这些标题按顺序可能包含如下各项: 1) 短模块描述。 2) 细节模块描述。 10部分第一部分分高级PHP 下载 3) 函数原型清单。 4) 标记/注解。 多行注释再一次表现出其优越性。 4.函数头注释 函数头应足够细致地为每一个函数(见清单1 - 6)描述句法、目的和必要的调用者信息。这 些注释的重要性,相对于内部注释来说是次要的,函数头注释的目的是让程序员在模块开发和 扩展中迅速了解每一个函数的要求,这些要求是为最初没有建立这些函数的“外人”所提供的, 缺乏函数头注释的源代码经常需要开发者深入其中找到所要信息,而这一点经常会导致错误, 因为不是所有隐藏的陷阱(有时它们隐藏得很好)都会被发现。 清单1-6 典型的函数头注释 一个函数头注释应按顺序包含如下各项: 1)函数原型。 2)函数细节描述。 3)标记/注解。 4)参数描述。 5)返回值描述。 6)全局引用。 7)作者和最后一次修改的日期。 5.内部注释 第1章认开发思想部分11 下载 内部注释直接放入代码中,并直接解释所有产生的问题。当你编写代码时,每件事你自己 当然是很清楚的,这就是有人经常不写注释的一般原因。后来当你重新打开这个文件时(甚至 也许是一年之后),你也许已遗忘你用的所有结构及使用它们的原因,这是我们经常遇到的一个 问题。在我们自己的代码中或别人的代码中使用内部注释的原则是:注释越多越好这一原则的 唯一例外是,注释不能被滥用到让人们对代码模糊不清的程度,同时,注意不要注释显而易见 的东西。清单1 - 7列举了一些例子。 清单1-7 不好的内嵌注释 在第一行中,因加1而增大的$ b a s e i n d e x代码是需要注释的语句吗?我们表示怀疑。每一个 人都能看得出$ b a s e i n d e x正加上1。但它为什么加1?为什么正好加1?更好的注释大致是这样的: 跳至我们所指的下一个指数,它仅有一个元素的距离。 第二个注解有同样的问题,但产生的原因不同。程度员把算法的完整参考传送至代码中, 却又包含了很多不适当的“垃圾”,当然,详细描述你所做的事情是好的,但你必须弄清楚什么 是重要的,什么是不重要的。 当你给代码添写注释时要考虑如下问题。 • 你在做什么? • 为什么要做这件事? • 为什么要采用这种方式做? • 为什么要在这个地方做? • 这个代码如何影响其他代码? • 这个代码要求什么? • 你的方法有什么缺陷吗? 例如,当你分析字符串的时候,记录输入串的格式,你的分析器的偏差(它对输入中的错 误的反应)和它的输出。如果这些信息太多,以致不能直接嵌入你的代码,那么至少要安置一 个指针,指向一个外部文件,在此文件中读者能够了解到分析器的各个方面。同时,要记住更 新函数头注释,即设置一个对此文件的链接。 12部分第一部分分高级PHP 下载 1.3.4 选择谈话式名字 正如前面所提到的,为函数和变量选择合适的名字在编程中是一个很重要的问题。一般情 况下,当为一个变量选择名字时,首先要确定它是全局变量还是局部变量,如果此变量仅在函 数的局部作用范围内可见,那么就给它选一个简洁、准确的名字来陈述此变量的内容或意义, 这个变量名应该至少包含两个词,这两个词或者被下划线分开或者被大写字母分开,如清单1 - 8 所示。 清单1-8 局部变量名实例 记住不要混用命名方案,要么都用小写字母来写变量名,用下划线来分隔词,要么使用大 写字母来分隔词。不要用大写字母来分隔一个变量而用下划线来分隔另一个,这会导致错误, 并且表现出不好的风格。一旦定好你自己的风格,就一直坚持到项目结束。 每一个全局变量都应该有一个前缀来标识它所属的模块,这一方案帮助把全局变量赋给它 们的模块,同时也可避免出自不同模块的同名变量在全局范围内产生冲突。前缀应该用下划线 和变量名分开,并应该包含一个词—多数是一个缩写(见清单1 - 9)。 清单1-9 全局变量名的例子 小尺寸优势 创建更小的项目,每一个项目都用不同的命名风格。原因如下: • 你能发现你偏爱的风格。 • 当你不得不适应别人风格时,能够很快变得熟练。 如上例所示,全局变量名倾向于比局部变量名长,这不仅是因为全局变量具有模块前缀, 也是为了分清全局变量和局部变量。当一个变量的定义和初始化因隐藏在一个你接触不到的模 块中而变得未知时,用变量的名字来思考它的意义和内容就显非常重要。这在实践中当然有个 极限—没人想记住多于四十个字母的名字—但这只是一般意义上的极限。 从根本上讲,你应该命名全局变量就像向某人描述它一样。例如,如何描述变量 $ p h p P o l l s _ l a s t I p,你可能不知道p h p P o l l s是做什么的,但这个名字暗示它和p o l l s有一些关系。 l a s t I P意指它是最后一个I P。哪一个I P,你不知道。显然,这个全局变量的名字选得不太好,因 为它并没有准确地描述其内容。现在假定你问这个变量的含义是什么,答案是,它包含最后一 个投票者的I P,现在想想该给它取一个什么名字? $phpPolls_ last_voters_IP听起来如何?更好一 点,不是吗?尽管这个名字可能很好,但它仍不合适,因为你曾见过另外两个同样出自p h p P o l l s 第1章认开发思想部分13 下载 的全局变量,都以p h p P o l l s 为前缀,然后紧跟一个词,出于一致性的考虑,你可以决定在名字 内部仅用大写字母来分隔不同的词: $ p h p P o l l s l a s t Vo t e r s I P。 函数名也应该用与全局变量名相同的相近风格加以处理,但略有不同。函数命名应描述它 们的功能而且要符合语流,让名字符合语流是通过确定函数行为、并选择在该名字大量出现之 处最适合的名字来实现的。 例如,如果用一个函数确定一个用户目前是否在线,它可能有以下名字中的一个: 考虑到返回值类型,上述清单中只有第一个和最后一个名字是合适的。假定函数将返回一 个布尔值,那么它经常用在一个与i f ( )语句的连接处。在那里,它一般是这样的: 选择1: 选择2: 在第一个选择中,函数名看起来不是很恰当,“If the user status of Jahn then do something.” 再检查一下,第二种可能性:“If the John is online then do something.”,第二个观点没有打破语流, 并且在第一眼见到的时候给人留下了更多印象。第一个选择把问题公开化:什么身份被谈及?该 身份如何返回?第二个函数名清楚地表示这个函数会检查某人的在线状况并返回一个布尔值。 如果检查结果在函数的变量参数中返回又会怎样? 选择1: 选择2 : 14部分第一部分分高级PHP 下载 尽管u s e r s t a t u s ( )并非一个不好的名字,但g e t o n l i n e s t a t u s ( )更好一些。“g e t”这个词很清 楚地表明函数检索在线状态并将其存于某个地方—或者在一个全局变量中,或者在一个函数 变量中。 对于仅仅进行数据处理的函数来说,要使用主动的而不是被动的名字。不要使用如 h u ff m a n _ e n c o d e ( )或d a t a b a s e _ c h e c k e r ( )这样的名字—将函数命名为h u ff m a n _ e n c o d e ( )和 c h e c k d a t a b a s e ( )或将两个词交换顺序,这将很好地适应模块前缀。 你的代码是两种语言的还是三种语言的 对代码最普遍的批评之一涉及“民族化”,一种程序语言(起源于英语)与另一种程 序语言搅合在一起。在我们的实际例子中,(To b i a s源于意大利语,Ti源于德语),当我们 检查各自国家程序员开发的项目时,我们发现他们喜欢使用德语和意大利语变量名和函 数名而不是用英语。这导致了一种奇怪的混淆。正如你不会在你的日常信件中混用英语、 法语、西班牙语等一样,所以,你在编程时也需要保持语言一致性,使用英文名字编写 PHP程序,还有助于外国人理解你写的程序。 1.3.5 保持清晰一致的接口 你也许不愿意再看到“一致性”这个词,但对于接口设计来讲,它是编程基石中的关键一 块。 非常不幸的是,P H P本身恰恰存在如何违反这一点的例子。 你在驾驶汽车的时候,油门在右而刹车板在左。当你换一辆车时,你希望情况也是如此, 无论你在哪里,你都希望红灯意味着停止,而绿灯意味着前进。类似地,当你用一个库访问文 件,且需要把一个文件句柄传给函数时,如果输出函数把文件h a n d u句柄作为第一个参数,输出 函授将其作为最后一个参数,而另一个把它作为中间参数,那么这会令人感到莫名其妙。 当设计接口时,你应该首先考虑如下问题: • 通过这个接口交换什么数据? • 我到底需要什么参数? • 大多数(或所有)的接口函数所共有的参数是什么? • 这些参数最合乎逻辑的顺序是什么? 把它们牢记在心中,一旦你决定采用何种方式去做,你就应该在你的模块中保持参数一致 性。即使内部函数也应遵从这一点。这一策略将使你以后能从接口中获得内部函数。另外,当 开发组的同组成员要将新的代码加入你的模块中时,他也会很感谢你让他们省了不少功夫。 在P H P手册中,你会看到诸如s t r p o s ( )、s t r c h r ( )、s t r r c h r ( )等一些字符串函数。它们之中,都 会有参数string haystack,string needle等,其中h a y s t a c k是在其中搜索的字符串,而n e e d l e是要 搜索到的字符串。现在,再看一下s t r r e p l a c e ( ),这个函数不仅会突然采用了一种不同的命名方 案,而且其参数也恰恰和其余的函数相反:它接受strig needle和string haystack。 产生这种矛盾的原因是: s t r r e p l a c e ( )是对e r e g r e p l a c e ( )的一个快速替代,并且大部分人会 从调用e r e g r e p l a c e ( ) (接收相反顺序的参数)转到调用s t r r e p l a c e ( )。当然,这种说法有一定道理, 第1章认开发思想部分15 下载 但是为什么r e g e x函数按一种与字符串函数相反的顺序接收参数呢?因为在P H P中,r e g e x函数反 映了在C中的相应函数。在开发一个应用程序的时候,看到s t r r e p l a c e ( )从其余函数中突现出来 是很别扭的事。在勾勒下一个接口的轮廓时,注意不要让这种情况发生在你的身上。 1.3.6 将代码结构化为逻辑群 应用程序通常包含不同的函数群,每一个函数完成一项特定的任务并(或)应用于特殊的 应用领域。例如,在写一个支持数据库的应用程序时,一个函数群应该仅仅对处理数据库访问 负责,这个代码确立了它自己的存在,能够安全地从程序的其余部分分离出来—只要你设计 得好。逻辑上只从事一项特定任务的函数群应该用某种方法设计,以使他们能够被独立地处理, 这些函数在形式上也应该和主代码分开,建立一个模块。在运行一个应用程序之前,你应该建 立一个能将所有函数归类在一起的函数清单,形成一个模块,并为每一个模块创建一个各自独 立的设计计划。要注意创建详细的数据流程图,以便使模块能够满足应用程序的各种要求。做 一个书面的整体计划,其重要性不可低估。由于篇幅所限,我们不能够再深入谈及这个问题, 但我们建议你读一些关于设计方法的好书。 1.3.7 抽取单独的代码块 抽取代码块是一项在设计和实施阶段都应该做的事情,通常一个函数应该能完成以下工作: 1)开一个文件。 2)从文件中打读取数据。 3)证实数据(将数据合法化)。 4)更正数据中的错误。 5)将数据写入文件。 6)关闭文件。 每一步都可以“包装”成单独的一个程序块,抽取这些块并从中创建单独的函数是一种很 好的方法。这不仅使你能够在别的函数中重新使用每一个程序块(你可能在别的地方也需要文 件操作的支持),而且还能使代码更容易阅读和纠错,你可以使被抽取的部分“放弹”,给它们 装备“纠错器”,以支持更多的东西。如果你采用内嵌法无法做到这一点,你的代码会很快变得 异常庞大而冗赘,另外,如果你在其他的函数中,使用同样的程序块时产生需纠正的错误,你 将不得不在使用此块的所有其他的函数中反复进行同样的纠正。 通过提取,可以把关键部分放在中心位置,只要更改一行程序,就可以改变所有相关函数 的行为。 1.4 使用文件将函数分类 我们已经论述过对源代码使用复合式文件是有好处的,但我们也同样建议你为其他资源使 用文件。这些资源可以是配置数据、客户标题、页脚或其他模板,以及任何从你的项目中可以 抽出来作为一个单独实体而存在的东西。 在一个项目中使用模块有很多好处: 16部分第一部分分高级PHP 下载 • 可以获得更小更容易维护的源代码文件。 • 可以对每一个文件进行不同的修改,而不必在整个项目中进行检查以进行一个微小的修 改。 • 可以将部分资源从项目中分离出来,用在其他项目中。 • 许多开发组成员能够同时工作在一个项目上,而不必在检查时将所有的文件合并成修正控 制系统。 以上论述适用于一个项目中存在的大部分资源。 文件应根据其内容加以命名。如果一些文件从属于一个更大的群体,可以给它们加一个共 同的前缀,文件一般应该放在项目根目标的子目录下。例如,一个数据库提取层,其中有可访 问不同数据库的模块,这些模块被“包装”成单独的文件, 每个文件名应冠以前缀d b a (这里 d b a代表database abstraction),这样你就得到了d b a m y s q l,d b a o d b c,d b a o r a c l e等名字。 要确保能够在将来通过使用配置模块目录来变更子目录,例如(注意d b a在本例中并不指代 P H P的d b a * f u n c t i o n s): 事例中的变量$ d b a r o o t、$ s o c k e t r o o t和$ p h p P o l l s r o o t应该包含在一个中央配置文件中,该 文件有对整个项目的全局化“选项”。该配置文件应该包含独立的源文件所需要大的,能使其在 全局范围内可用的选项。这种“选项”可包括环境选项,如站点名、文件系统位置等等。 停留在(普通的) 路径上 当某子目录包含配置文件时,要一直使用相对路径以确保项目在文件系统及用户系 统上是灵活的—不依赖开发环境的任何特定条件,就像在其他环境下一样。能保持一 般化的东西就要尽量让它一般化。 1.5 编写文档 除了注释和结构化以外,文档也是值得注意的,一个项目的文件记录可能是你的用户将要 见到的项目的第一部分,而第一部分是至关重要的。 规范化写出的文档应该是开发过程中惯例性的一步。正如你希望微型电话或其他哪怕是在 很小的商店中购买的技术产品都有一本写得很好的手册一样,你的用户也希望从你那里得到较 好的文档(更不用说他们可能会为此而付一大笔钱了)。 和注释一样,文件记录通常是在R A D工具的帮助下产生的,很不幸,目前还不存在专为 P H P设计的相应工具,所以写手册是一项费力不讨好,但却很有必要的—份工作。并且,这并不 会影响你的工作效率。一个完整的手册应具有像书一样的内容结构,一般包括以下几项: 第1章认开发思想部分17 下载 • 介绍。 • 内容表。 • 用户指导。 • 技术文件。 • 开发者指导。 • 完整的函数参考。 用户指导应该详细地描述为标准用户设置的应用程序接口(如果有的话)的所有特征,在 这一部分不要太专业化,它应该仅仅是一个“如何”程度上的描述,但要确保每一方面都阐述 得很详尽。技术文件应该为对技术感兴趣的用户和管理者而写,并应包含应用程序的技术要求、 使用和引入的规范以及关于内在数据处理的信息(只要这是读者所感兴趣的)当然,这也要在 你许可的允许范围之内。如果你允许用户看见和(或)修改源代码,那么编写一份开发者指导 来解释项目的结构、数据流、内在关系以及列出所有的函数参考(包括内在函数),并要有完整 的描述。 如果你在一个开发组中工作,职业技术作者将是这一群体的有力助手——他们有书写技术 文件的经验,也有充裕的时间。让一个有开发任务的组员同时写文件记录会导致大量额外的压 力,因为程序开发者总是很忙碌的,他们不想误期。 1.6 一个API设计实例 参照所有的理论,我们设计一个应用程序接口,以使你熟悉前面所讨论的思想和规范。请 注意,这是一种实际的解决方法,而非一种理论上的方法。我们采用这种实际的方式是为了让 你熟知每一步。在今后的项目中,你必然在纯理论的基础上设计A P I,而不必首先看代码。关于 理论方法的线索、提示和决窍,参见第3章。 我们创建的A P I模块是用来处理一个简单的日程管理器。这个日程管理器函数的实际应用并 不重要,记住,这恰恰是使用户模糊不清的地方。用户只是想管理一组约会,因此A P I必须以这 样的方式来设计,即提供一个约会管理的接口。无论你是在用J u l i a n或G r e g o r i a n日期还是你自己 的格式,都不必通知基本系统的用户,在某些时候,你可能想给用户提供一套额外的功能(例 如:日期格式转换),但如果你所需要的仅仅是管理约会,这就是完全不必要的。 另一方面,这并不意味着阻止甚至破坏这些功能的进一步使用,设计一个A P I的技巧在于它 恰好满足你一时的要求,即能够把A P I扩展到最终需要的功能。这需要深入的计划和定义,正如 本章一直在讨论的那样。 A P I是访问其自身所代表的模块功能的唯一途径,没有功能会丢失,也不会有任何不必要的 功能会出现,甚至并不直属这一模块的功能都不会有。 一个简单日程管理器的要求如下: • 增加一个事件。 • 删除一个事件。 • 检索即将发生事件的清单。 让我们首先为增加和删除事件定义原型;如清单1 - 1 0所示,这些函数需要什么信息,又能提 18部分第一部分分高级PHP 下载 供给我们什么返回值呢? 清单1-10 前两个函数的原型 由上我们最先得知的是:一个可接收“一般意义”参数清单的接口,即用日/月/年表示的日 期和用小时/分钟/秒钟表示的时间,以及描述一个约会的字符串,这些函数无返回值,它们的名 字是谈话式的。 谈话式的?是的,但是它们是很好的谈话式名字吗? a d d a n e v e n t ( )是谈话式的名字,但对 这个函数来说并非最佳选择。首先,由这个函数的全局可见,它是A P I的主要元素。既然这样, 它就应该有一个名字前缀以清楚表明它本身也属于A P I。应该加一个什么样的前缀呢? c a l e n d a r 和s c h e d u l e r是很好的方案,在这个例子中,我们选用C a l e n d a r(见清单1 - 11)。 清单1 - 11 重命名后的函数原型 现在,我们有了个前缀,但名字仍让人不满意,在“ c a l e n d a r _ a d d _ a n _ e v e n t ( )”和 “c a l e n d a r d e l e l e a n e v e n t”中的“a n”是不必要的。它是产生于选择“过度谈话式”名字的遗 迹,选择函数名时删除诸如a、a n和t h e一类的词是一个很好的习惯。在大多数情况下,这些词占 用空间但却起不到多大的区分作用,因为它们没有解释功能。特别地,当选择变量名时,这些 词应该彻底避免,选择诸如$ a k e y或$ t h e k e y一类的名字是毫无意义的,因为k e y是显而易见的。 选择一个可以解释什么k e y的名字会更有意义。如: $ l a s t u s e r k e y。 清单1 - 1 2列出了重命名的函数。 清单1-12 最终函数名 下面转到另一个问题,这些函数有庞大的参数表,有这个必要吗?这些参数是根据一般的 日期格式,即把日、月、年、小时、分钟、秒钟分开的格式选择的。然而,用一个接口来交换 信息是不正规的,函数几乎不应该接收五个以上的参数。如果有更多的参数,你应该考虑使用 结构体,结构体可以使接口变得清晰,这在很多时候是一个比避免初始化和(或)修改结构体 而带来额外工作量更显得有意义。 在把所有的参数都放置到结构体中之前,仍有替换数据格式的可能性,为了将日期和时间 代码化,你可能会使用B C D(Bianry Coded Digits)码或UNIX timestamps格式,这两种格式把 第1章认开发思想部分19 下载 所有需要的变量“包装”到一个变量中。B C D码仍是广泛流行的代码,但在产生于U N I X式平台 的P H P中,t i m e s t a m p s占据主导(见清单1 - 1 3)。如果你还没有遇到过t i m e s t a m p s,这里简单介绍 一下: t i m e s t a m p s计算自1 9 7 0年1月1日U T C零时以后的秒钟的数日,并以3 2位十进制数表示出来, 这会在2 1 0 6年导致一次回绕。但是由于P H P设有固定的3 2位类型来处理t i m e s t a m p,P H P有可能 把t i m e s t a m p s的大小转变为6 4位以保持Y 2 . 1 0 6 K适用性。你的应用程序不会觉察到这一点。 Ti m e s t a m p的另外一个优点是:有大量的P H P函数可以把它们转换成人们可读的日期或进行相反 转换。用t i m e s t a m p来进行计算也是很容易的,例如为了得到两个事件的不同点,你只需把一个 t i m e s t a m p从另一个里面扣除。 清单1-13 修正的A P I 正如你所见到的那样,为了处理一种特殊的数据,进行现有格式和方法的检查是非常重要 的。目前的格式不仅把参数清单缩小了3 5 0 %,而且它也是一个处理日期和时间的基本结构的基 本格式。检查文本格式和现存标准是一个在研究阶段永远都不该忽视的步骤。在开发阶段,也 不应受任何偶然事件的影响。了解开发范围是必须的。 把这些牢记在心中,让我们看一下第三个必需的函数,它用来检索即将发生事件的清单, 我们就要遇到问题了,因为返回值不是一个,而是一组相关变量的清单。 时间信息1 => 描叙1 时间信息2 => 描叙2 时间信息3 => 描叙3 这些数据可以通过用参考变量传递参数的方式返回(参见第2章,“高级语法”): 这个伪代码会在两个数组$ t i m e s t a m p和$ d e s c r i p t i o n中按请求顺序排列即将发生的事件。 I n d e x 1将在$ t i m e s t a m p [ 0 ]中包含事件1的t i m e s t a m p,在$ d e s c r i p t i o n [ 0 ]中包含事件的描述。 然而,这仅是一个非最佳解决方案,因为让两个分离变量处理集群化的元素是一种不恰当 的方法。为了处理集群化元素,应该使用集群化数据类型或者是一个类(这是P H P中唯一建立结 构化类型的方法)或者是一个相关数组。 20部分第一部分分高级PHP 下载 相关数组的优势是:即可被下标(索引组成元素—在通常数组中,一般是0、1、2、3等) 搜索又可被值(信息量大的组成元素)搜索。但是此处,它们有一个变化的结构,这种结构能 被改变,但会导致不合法结构数据的存在,并且处理起来有些笨拙。 类有完善展示自身结构的优势,但需要一个预先定义的数据类型。如果我们为返回值定义 一个数据类型,出于一致性的考虑,我们也用这个数据类型来创建和删除事件。这反过来会要 求我们修改现存的函数—仅仅填加一个函数是不会令人满意的,你现在可以看出事先进行的 详细理论计划可以为我们节省宝贵的时间。在开始定义头两个函数前,定义一个结构化的数据 类型将使我们在定义函数时可以使用这一类型,这样我们就有一个可以在清单函数中重新采用 的一步到位的解决方法。 由于一个类将会向代码中引入一种风格,我们一般使用相关数组。清单函数将不会返回错 误代码,所以我们使用函数的返回值来把数据传递给调用者。记住,如果你打算使用错误代码, 你应该使所有函数返回错误代码,即使它们会永远成功,你也应该创建一种一致的错误代码方 案因为通常地,你的A P I用户并不知道某一函数是否会成功运行。但他们希望如果函数运行错误 时都会返回一个错误标志值。第3章有更多的关于这一点的内容。 返回到清单函数,下面是选用的函数类型: 这些代码可能会产生如下结果: 看起来不错,但在代码中有另一个主要的错误,在f o r ( )循环中,数据在二维数组中使用相关 键标t i m e和t e x t来返回,这些变量在早些时候被分别命名,它们是针对时间的$ t i m e s t a m p变量和 针对描述文本的$ d e s c r i p t i o n变量。当填充相关数组时要为键标使用与变量相应的名字。在这里 f o r()循环可以访问如下数组: 第1章认开发思想部分21 下载 1.7 小结 应用程序开发不仅仅是草草写下代码、使句法准确并保证软件运行。因为软件不仅要被计 算机读,将来也要被程序员(或你自己)读,源代码应该清楚、准确、简洁、书写良好,容易 阅读、有注释、使用自然语言表达, A P I应该构造清晰易懂、前后一致的接口;应该被结构化成 逻辑单元,并在最后做出摘要。由于大的项目即使用最清晰的代码编写也不能不言自明,所以 技术文件是必须撰写的。 本章介绍的编码规范,是以来自许多程序员所积累经验的一般意义上的指导原则为基础的, 并不是强制性的规则。它们不难掌握,会使你和你的编程伙伴的生活更加轻松。 22部分第一部分分高级PHP 下载
6KB
QQ登录接口集成QQ 登录ASP.net 代码,登陆DEMO
2011-10-12注意: 不需要很多的类库 全部下来只有三个文件 。一个类库和两个前台页面,你将类库放到AppCode下面。然后将账号绑定那一块注释掉就行了,或者将账号绑定部分换成你自己系统的。就可以了。程序报错可能是因为我在绑定账号那里用到了别的类,你注释掉就行了 ------------------------------------------------------------ 经过两天的努力 已经成功将QQ登录集成到了 城记网 上。感谢腾讯提供的帮助文档,和关键时刻给的技术支持。我的网站是asp.net写的,有需要的网友可以联系我。 呵呵。(尽管是垃圾站,只要你愿意,又有什么关系呢?) QQ Oauth 只提供PHP的接入demo ,针对 ASP.net 的只有一个网友开发的SDK包,下载地址还老打不开,后来我从CSDN上下载了一个,看了以后感觉太复杂了,我个人感觉做这么个小事情不需要搞个SDK出来,不如自己按帮助文档去写,这样自己写的方法灵活性就高一些,于是就按文档学习开发。其实文档写得很清晰,耐心一看就明白了。 不讲太多的郁闷的过程了,直接说解决办法。 办这个事情主要要知道下面几个事情。 两个重点(如下): 第一个重点:请求Token的步骤, 1:请求未授权的临时token。请求成功以后会转到QQ登录页面。 2:请求已授权的临时token。登陆成功以后获得。 3:请求已授权的Access token。 第二个重点:签名的算法。 签名的值计算有一个指定的规则,请参考腾讯开放社区帮助文档,这是最 好的资料。 注意点: 没有申请APPID和APPKEY的先去申请。 传递的每一参数都要URLENcode,注意是每一个,包括动态生成的签名。 参数之间是有顺序的,是升序排列的,无论有多少个,都要排序。 各个步骤之间是有关联的,下一步的提交往往需要上一步的返回参数。 我采取的文档结构: 总共三个文件 ,非常简单。 一个放在APPcode下面的类。用来发送请求和接待参数。 两个前台页面,主要是对类的调用。 下面把类的代码完全贴出,你知要一看见类,就知道怎么写前台页面了,很简单
4KB
用程序输出“当前时间是XXXX年XX月XX日XX时XX分XX秒(第XX周,周X)
2014-06-271 按照某种格式输出系统时间:自学java中的时间。自学Date类(java.util.Date)和SimpleDateFormat类,用程序输出“当前时间是XXXX年XX月XX日XX时XX分XX秒(第XX周,周X)” 2 比较String与StringBuffer、StringBuilder的自增速度。方法:在自增前记录系统时间,进行5000次自增,然后再记录系统时间,可以得出自增的速度。获取系统时间的方法是java.lang.System.currentTimeMillis() ,见JDK API。 3 定义点类,圆是由圆心(点)和半径组成的,请完成圆类,注意“派”为常量,取3.14。圆类具有judge函数可以判断两圆的关系:相离、相交(包括相切)、嵌套、重合。设计static成员用以求所有圆对象的平均面积。(static、final) 4 图形间的关系可以下图用来表现。所有的图形中都可以称为Shape。由这个类可以派生出二维图形TwoDimensionalShape和三维图形ThreeDimensionalShape类。每个TwoDimensionalShape类应包括成员函数getArea以计算二维图形的面积。每个ThreeDimensionalShape类包含成员函数getArea和getVolume,分别计算三维图形的表面积和体积。编写一个程序,用一个数组乘放各种图形类对象(包括二维和三维的),并输出对象得相应信息。如果某个图形是TwoDimensionalShape就显示其面积,如果某个图形是ThreeDimenionalShape,则显示其面积和体积。请完成图中所有的类并在主函数中做测试。(继承与多态)
29KB
javascript入门笔记
2018-05-15Javascript Basic 1、Javascript 概述(了解) Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 JS解释器/引擎 是JS的运行环境: 1、独立安装的JS解释器 - NodeJS 2、嵌入在浏览器中的JS解释器 JS的发展史: 1、1992年 Nombas 开发了一款语言 ScriptEase 2、1995年 Netscape(网景) 开发了一款语言 LiveScript,更名为 Javascript 3、1996年 Microsoft(微软) 开发了一款语言 JScript 4、1997年 网景 将Javascript 1.1 提供给了ECMA(欧洲计算机制造商联合会),ECMA 获取了 JS 的核心,称之为 ECMA Script (ES) 完整的JS组成: 1、核心(ES) 2、文档对象模型(Document Object Model) - DOM 允许让 JS 与 HTML 文档打交道 3、浏览器对象模型(Browser Object Model) - BOM 允许让 JS 与 浏览器进行交互 JS是一款基于对象的编程语言 2、JS的基础语法 1、浏览器内核 内核负责页面内容的渲染,由以下两部分组成: 1、内容排版引擎 - 解析HTML/CSS 2、脚本解释引擎 - 解析Javascript 2、搭建JS运行环境(重点) 1、独立安装的JS解释器 - NodeJS console.log("Hello World"); console.log('Hello World'); 2、使用浏览器中的内核(JS解释引擎) 1、在浏览器的控制台(Console)中,输入脚本并执行 2、将JS脚本代码嵌入在HTML页面中执行 1、采用HTML元素事件执行JS代码 事件 : 1、onclick 当元素被点击时执行的操作 ex: 当按钮被点击时,在控制台中输出 Hello World <button type="button" World');"></button> 2、将JS脚本编写在 [removed][removed] 并嵌入在HTML文档的任何位置 [removed] console.log("... ..."); [removed]("<h1>Hello Wolrd</h1>"); [removed] 3、将JS脚本编写在外部独立的JS脚本文件中(***.js) 步骤: 1、编写JS脚本文件 2、在HTML中引入脚本文件 [removed][removed] 练习: 1、先创建一个 base.js 的文件 2、在文件中执行以下代码 console.log(" .... ... "); [removed](" ... ... "); window.alert("这是在外部脚本文件中的内容"); 3、在 html 文档中,引入 base.js 文件 3、JS调试 当代码编写出现错误时,在运行的时候,在错误位置会停止 碰到错误代码,会终止当前语句块的执行,但不影响后续块的执行 [removed][removed] 为一块 4、JS语法 1、语句 - 可以被JS引擎执行的最小单元 由表达式、关键字、运算符 来组成的 严格区分大小写 :name 和 Name 所有的语句都是以 ; 来表示结束 所有的标点符号都是英文的 ; 和 ; . 和 。 : 和 : " 和 “ ' 和 ‘ () 和 () [] 和 【】 {} 和 {} 2、注释 单行注释: // 多行注释: /* */ 3、变量 与 常量 1、变量 1、什么是变量 用来存储数据的一个容器 2、声明变量(重点) 1、声明变量 var 变量名; 2、为变量赋值 变量名=值; 3、声明变量并赋初始值 var 变量名=值; 注意: 1、变量在声明时没有赋值的话,那么值为 undefined 2、声明变量允许不使用var关键字,但并不推荐 练习: 1、创建一个网页 04-variable.html 2、声明一对 [removed][removed],并完成以下变量的声明 1、声明一个变量用于保存用户的姓名,并赋值为 "张三丰"; 2、声明一个变量用于保存用户的年龄,赋值 68 3、如何 将变量的数据 打印在控制台上?? 4、一条语句中声明多个变量 var 变量名1=值,变量名2=值,变量名3; 3、变量名命名规范 1、由字母,数字,下划线以及 $ 组成 var user_name; 正确 var user-name; 错误 var $uname; 正确 2、不能以数字开头 var 1name;错误 3、不能使用JS中的关键字 和 保留关键字 4、变量名不能重复 5、可以采用"驼峰命名法",小驼峰命名法使用居多 6、最好见名知意 var a; var uname; 4、变量的使用 1、为变量赋值 - SET操作 只要变量出现在 赋值符号(=)的左边一律是赋值操作 var uname="张三丰"; uname="张无忌"; 2、获取变量的值 - GET操作 只要变量没有出现在赋值符号(=)的左边,一律是取值操作 var uname="wenhua.li";//赋值操作 console.log(uname); var new_name = uname; new_name 是赋值操作 uname 是取值操作 uname = uname + "bingbing.fan"; 赋值符号出现的话,永远都是将右边的值,赋值给左边的变量(从右向左运算) 2、常量 1、什么是常量 在程序中,一旦声明好,就不允许被修改的数据 2、声明常量 const 常量名=值; 常量名在命名时采用全大写形式 作业: 1、声明一个变量 r ,来表示一个圆的半径,并赋值 2、声明一个常量PI ,来表示圆周率3.14 3、通过 r 和 PI 来计算 该圆的周长,保存在变量l中 周长 = 2 * π * 半径 4、通过 r 和 PI 来计算 该圆的面积,保存在变量s中 面积 = π * r * r; 5、在控制台中打印输出 半径为 * 的圆的周长是 * 半径为 * 的圆的面积是 * 笔记本名称:ThinkPad E460 笔记本价格:3000 笔记本库存:100台 1、运算符 1、位运算符 1、作用 将数字转换为二进制后进行运算 只做整数运算,如果是小数的话,则去掉小数位再运算 2、位运算 1、按位 与 :& 语法 :a & b 特点 :将 a 和 b 先转换为二进制,按位比较,对应位置的数字都为1的话,那么该位的整体结果为1,否则就为0 ex:5 & 3 5 :101 3 :011 =========== 001 结果 :1 使用场合:任意数字与1做按位与操作,可以判断奇偶性,结果为1,则为奇数,否则为偶数 0 :0 1 :1 2 :10 3 :11 4 :100 5 :101 5 & 1 101 001 ========== 001 4 & 1 100 001 ==== 000 2、按位 或 :| 语法 :a | b 特点 :将 a 和 b 转换为 二进制,按位比较,对应位置的数字,至少有一位为1的话,那么该为的整体结果就为1,否则为 0 ex : 5 | 3 101 011 ======== 111 结果为 :7 适用场合:任何小数与0 做 按位或的操作,可以快速转换为整数(并非四舍五入) 5 | 0 101 000 ==== 101 3、按位 异或 :^ 语法:a ^ b 特点:将 a 和 b 先转换为二进制,按位操作,对应位置上的两个数字,相同时,该位整体结果为0,不同时,该位的整体结果为 1 使用场合:快速交换两个数字 5 ^ 3 101 011 ========== 110 结果为 6 练习: var a = 5; var b = 3; a = a ^ b; b = b ^ a; a = a ^ b; console.log(a,b); 3、赋值 和 扩展赋值运算符 1、赋值运算符 := 2、扩展赋值运算符 +=,-=,*=,/=,^=,... ... a += b; ==> a = a + b; a = a + 1; ==> a += 1; ==> a++ ; ==> ++a 3、练习 1、从弹框中,分两次输入两个数字,分别保存在 a 和 b中 2、如果 a 大于 b的话 ,则交换两个数字的位置 使用 短路&&,扩展赋值运算符,位运算 4、条件运算符(三目运算) 单目(一元)运算符 :++,--,! 双目(二元)运算符 :+,-,*,/,%,>,<, ... ... 三目(三元)运算符 :?: 1、语法 条件?表达式1:表达式2; 条件是一个boolean类型的数据,如果条件结果为true,则执行表达式1的内容,并将表达式1的结果作为整体表达式的结果。如果条件为false,则执行表达式2的内容,并将表达式2的结果作为整体表达式的结果 ex: var age = 28; var msg = age >= 18 ? "你已成年" : "你未成年"; 练习: 从弹框中录入一个数字表示考试成绩(score) 如果 成绩为 100 分 ,提示 :满分 如果 成绩 >= 90 分 ,提示 :优 如果 成绩 >= 80 分 ,提示 :良 如果 成绩 >= 60 分 ,提示 :及格 否则 :提示 不及格 2、函数 1、什么是函数 函数(function),是一段预定义好,并且可以被反复使用的代码块 预定义好 :事先声明,但不是马上执行 反复使用 :可以被多次调用 代码块 :包含多条可执行的语句 2、函数的声明与调用 1、普通函数 语法: function 函数名(){ 语句块; } 调用:在JS中任何的合法位置处,都可以通过 函数名() 的方式进行调用 练习: 1、声明一个函数,名称为 change 2、在函数中 1、通过弹框,分两次,录入两个数字,保存在 a 和 b 2、先打印 a 和 b的值 3、如果 a > b 的话,则交换两个数字的位置 4、再打印 a 和 b的值 3、在网页中,创建一个按钮,点击按钮时,完成 change 函数的调用 2、带参函数 1、定义语法: function 函数名(参数列表){ 语句块; } 参数列表: 可以由0或多个参数的名称来组成,多个参数的话中间用 , 隔开 定义函数时的参数列表,都称为 "形参(形式参数)" 2、调用语法 任意合法JS位置处 函数名(参数列表); 调用函数时,所传递的参数列表,称之为"实参(实际参数)" 3、练习 1、定义一个函数 change ,该函数中接收两个参数(a,b) 2、在函数体中,如果 a 大于 b的话,则交换两个数字的位置,再打印输出结果 3、通过一个按钮调用函数,并且将 两个数字传递给函数 4、常用带参函数 parseInt(变量); parseFloat(变量); Number(变量) console.log(""); 3、带返回值的函数 var result = parseInt("35.5"); 1、什么是返回值 由函数体内 带到 函数体外的数据,叫做"返回值" 2、语法 function 函数名(参数列表){ 语句块; return 值; } 允许通过一个变量来接收调用函数后的返回值 var 变量名 = 函数名(实参列表); 3、练习 定义一个可以接收三个Number参数的方法(名称为getMax),在该方法中,计算并返回 最大的数值 3、作用域 1、什么事作用域 指的是变量和函数的可访问范围,作用域分为以下两类 1、函数作用域 只在定义的函数内允许访问变量 和 函数 2、全局作用域 一经定义,在任何位置处都能访问 2、函数作用域中的变量 在某个函数中声明的变量,就是函数作用域中的变量,也可以称之为 "局部变量"。 function calSum(){ var a = 3; var b = 5; console.log(a,b); // 输出 3 5 } console.log(a,b); //错误,因为 a ,b已经出了它的定义范围 练习: 1、定义一个 函数calSum,声明两个变量a,b,并赋值,并且在函数内打印两个变量 2、定义一个 函数calMax,直接打印输出 a,b,观察结果 3、全局作用域中的变量 一经声明了,任何位置都能使用。也称为 "全局变量" 声明方式: 1、将变量声明在最外层,所有的function之外 [removed] var a = 15; var b = 18; function showMsg(){ console.log(a); console.log(b); } [removed] 2、声明变量时,不使用var关键字,一律是全局变量,但有风险 建议: 全局变量 ,尽量都声明在 所有的 function 之外 声明变量时,也一律都使用 var 关键字 4、声明提前 Q : function show(){ console.log(num);//报错 } 1、什么是声明提前 JS程序在正式执行前,会将所有var声明的变量以及function声明的函数,预读到所在作用域的顶端。但赋值还保留在原位置上 2、建议 最好将变量的声明 和 函数的声明都集中到所在作用域的最顶端 5、按值传递 Q : function change(a,b){ a ^= b; b ^= a; a ^= b; console.log("在change函数中"); console.log(a,b); } function testChange(){ var a = 15; var b = 18; console.log("调用前:"); console.log(a,b);//15 18 change(a,b); console.log("调用后:"); console.log(a,b);//15 18 } 1、什么是按值传递 基本数据类型的数字在做参数传递时,实际上时传递的实参的副本到函数中,原始数据并未发生过改变 2、建议 基本数据类型的数据在做参数传递时,尽量不要在函数中修改,因为即便修改,也不会影响原数据的 6、局部函数 将函数 再声明在某个函数内,就是局部函数 [removed] function show(){ function inner(){ console.log("show 中的 inner 函数"); } inner();//正确 } inner(); // 错误,inner 是局部函数,只能在 show中被调用 [removed] 7、全局函数 ECMAScript预定义的全局函数,可供用户直接使用 1、paseInt(); 2、parseFloat(); 3、Number(); 4、isNaN(); 5、encodeURI() URL:Uniform Resource Locator :统一资源定位符/器 URI:Uniform Resource Identifier : 统一资源标识符 1、作用 对统一资源标识符格式的字符串进行编码,并返回编码后的字符串 编码:将多字节的字符,编译成多个单字节的字符 6、decodeURI() 1、作用 对已编码的URI进行解码(将已编码内容再转换回中文) 7、encodeURIComponent() 在 encodeURI 基础之上,允许将 特殊符号(:,/,...) 进行编码 8、decodeURIComponent() 9、eval() 作用:计算并执行以字符串方式表示的JS代码 var msg = "console.log('Hello World');"; eval(msg);//将 msg 作为 JS代码去执行 练习: 1、创建页面,通过弹框,输入一段JS代码 2、通过 eval() ,将输入的JS代码执行一次 3、递归调用 1、什么是递归 递归指的是在一个函数中,又一次的调用了自己 2、递归的实现 1、边界条件 2、递归前进 - 继续调自己 3、递归返回 - 向上返回数据 3、解决问题 1、计算某个数字的阶乘 5的阶乘 5!=5*4*3*2*1 5! = 5 * 4! 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1 /*计算 n 的阶乘*/ function f(n){ ... ... } 4、作业 已知下列数列 (菲波那切数列) 1,1,2,3,5,8,13,21,34,55,... ... 已知 第一个数为1,第二个数为1 从第三个数开始,每个数字等于前两个数之和 问题:通过一个函数,求某个位置上的数字(用递归实现) https://www.baidu.com/s?wd=佳能 https://www.baidu.com/s?wd=尼康 function test(){ console.log("Hello World"); } var result = test(); console.log(result); =========================== 输出结果: Hello World undefined [removed] var g_uname = "sanfeng.zhang"; function showName(){ var uname = "wuji.zhang"; console.log(uname);//wuji.zhang } [removed] function test(){ console.log(num); // 打印 :undefined var num = 15; } 演变成: function test{ var num; // 先声明,但不赋值(自动完成) console.log(num); // 打印 :undefined num=15;// 只赋值,不声明 } 推荐写法: function test(){ var num = 15; console.log(num); // 打印 :15 } *********************************************** 作业: 1,1,2,3,5,8,13,21,34,55,... ... 已知: 该数列中前两个数都是 1 从第三个数开始,每个数字等于前两个数的和 /*通过 f 函数,计算第 n 个数字是多少*/ function f(n){ } f(5) : 求第五个数字是多少 ================================================= 1、分支(选择)结构 1、流程控制结构 1、顺序结构 - 自顶向下的执行 2、分支结构 - 有条件的选择某一段代码去执行 3、循环结构 - 有条件的选择某一段代码反复执行 程序 = 数据结构 + 算法 2、练习 编写一个收银柜台收款程序,根据商品单价,购买数量以及收款金额计算并输出应收金额和找零 数据:商品单价,购买数量,收款金额,应收金额,找零 输入数据:商品单价(price),购买数量(count),收款金额(money) 输出数据:应收金额(total),找零(change) Q : 当商品总价>=500时,享受8折优惠 3、if 结构 语法: if(条件){ 满足条件要执行的语句块 } 流程: 1、判断条件 2、如果条件为真,则执行 语句块 中的内容 3、如果条件为假,则跳过语句块去执行其他内容 注意: 1、if中的条件,最好是一个boolean的值,如果不是boolean类型,则会自动转换 以下情况,条件会自动转换为 false if(0) if(0.0) if(undefined) if(null) if("") if(NaN) if(35.5){ //真 } var num; if(num){ //假 } if("李文华真帅"){ //真 } 2、if 后的 { } 是可以被省略的,如果省略的话,只控制 if 下的第一条语句 问题:考虑异常情况,如果收款金额小于应收金额 如果 收款金额大于等于应收金额,则正常执行 否则 则给出异常提示 4、if ... else ... 结构 语法: if(条件){ 满足条件时,执行的语句块 }else{ 不满足条件时,执行的语句块 } 练习: 1、从弹框中,输入一个年份信息 2、判断该年是否为闰年,并给出提示 输入年:2009 2009年不是闰年 输入年:2012 2012年是闰年 5、if ... else if ... 结构 语法: if(条件1){ //满足条件1时,要执行的语句块 }else if(条件2){ //满足条件2时,要执行的语句块 }else if(条件n){ //满足条件n时,要执行的语句块 }else{ //以上条件都不满足时,要执行的语句块 } 练习: 从弹框中,分三次录入 年,月,日 判断该日是该年的第多少天 提示: 1,3,5,7,8,10,12 :每月31天 4,6,9,11 :每月30天 2 :闰年29天,平年28天 2017年8月21日 : 31+29+31+30+31+30+31+21 6、switch ... case Q : 从弹框中录入 1-7 中的任一一个数字 录入 1 :输出 :今天吃红烧肉 录入 2 :输出 :今天吃红烧排骨 录入 3 :输出 :今天吃红烧丸子 录入 4 :输出 :今天红烧鱼 录入 5 :输出 :今天吃烤羊腿 录入 6 :输出 :今天休息 录入 7 :输出 :今天休息 场合:等值判断 语法: switch(变量){ case 常量值1: 语句块1; break;//通过 break 结束switch的执行(可选 ) case 常量值2: 语句块2; break;//可选 default: 语句块n; break;//可选 } 练习: 1、使用 特殊的 switch 结构完成下列要求 输入年 ,月 输出 该月有多少天 1,3,5,7,8,10,12 : 31天 4,6,9,11 : 30 天 2 : 平年28天,闰年29天 ex: 年:2017 月:5 输出:31天 1、使用 特殊的 switch 结构完成下列要求 2、改版日期计算器(难度) 输入年月日,判断该日是这一年的多少天 var month = Number(prompt()); var totalDays = 0; switch(month-1){ case 11: totalDays += 30; case 10: totalDays += 31; case 9: totalDays += 30; ... ... } 2、循环结构 1、问题 1、控制台上打印一句Hello World 2、控制台上打印十句Hello World 3、控制台上打印10000句 Hello World 4、改版第3步,增加 第 ? 句 Hello World 第 1 句 Hello World 第 2 句 Hello World ... 第 10000 句 Hello World 5、改版第4步 将 Hello Word 替换成 "你好 世界" 练习: 6、打印输出 1-100之间所有数字的和 2、什么是循环结构 循环,就是一遍又一遍的执行相同或相似的代码 两个重要的要素: 1、循环条件 :循环执行的次数 2、循环操作 :循环体,要执行相同 或 相似的代码是什么 3、while 循环 1、语法 while(条件){ //循环操作 } 流程: 1、判断条件 2、如果条件为真,则执行循环操作,然后再次判断条件。当条件为假时,则退出循环结构 4、循环的流程控制语句 1、break 破坏了整个循环的执行 - 结束循环 2、continue 结束本次循环,继续执行下次循环 练习: 1、使用 continue ,打印输出 1-100之间所有偶数的和 2、让用户循环从弹框录入信息,并将信息打印在控制台上,直到用户输入 exit 为止 输入数据:sanfeng.zhang sanfeng.zhang 输入数据:wuji.zhang wuji.zhang 输入数据:exit 3、猜数字游戏 1、随机生成一个 1-100 之间的数字 Math.random() 返回 0-1 之间的小数 var r = parseInt(Math.random()*100)+1; 2、要求用户输入一个整数 若比生成的随机数大,则输出 “猜大了” 若比生成的随机数小,则输出 “猜小了” 直到用户 猜对为止 3、如果用户输入exit ,也可以退出游戏 3、作业 用户从弹框中输入年,月,日,判断该日是星期几? 1900年1月1日 是星期1 推荐思路: 从1900年1月1日 到 输入的年月日 共有多少天求出来,与 7 取余 1、通过一个循环计算从1900年 到输入年前一年有多少天? 2、再从1月,到输入月份的前一个月共有多少天? 3、再累加 输入的日 4、用整体结果 与7取余,给出提示 附加作业: 将 输入的月份的日历打印输出 2017年8月 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 while(i > 0){ switch(i){ case 1: console.log(); break; case 2: console.log(); continue; // 作用在 while } } switch(i){ case 1: console.log(); continue; // 错误 } =================================================== 1、循环结构 1、do ... while() do{ 循环操作 }while(循环条件); do...while VS while 1、while 先判断条件,再执行循环操作 如果条件不满足,循环一次都不执行 2、do ... while 先执行循环操作,再判断循环条件 即便条件不满足,也要执行一次循环操作 练习: 将猜数字的游戏,改版成 do ... while 循环版本 2、for() 循环 1、语法 for(表达式1;表达式2;表达式3){ //循环操作 } 表达式1:循环条件的声明 表达式2:循环条件的判断(boolean) 表达式3:更新循环条件(i++,... ...) 执行过程: 1、计算表达式1的值 2、计算表达式2的值,如果结果为true则执行循环体,否则退出 3、执行循环体 4、执行表达式3 5、再计算表达式2的值,为true执行循环体,否则退出 while do...while 和 for 的使用场合: 1、while 和 do...while 适合使用在不确定循环次数的循环下 2、for 适合使用在确定循环次数时使用 练习: 1、定义一个函数,打印乘法口诀表中的任一一行 输入要打印的行数:5 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 2、定义一个函数,打印 1/1+1/3+1/5+...1/999的和 3、定义一个函数,判断指定的数字是否为素数 素数:只能被1 和 它本身整除的数字 输入一个数字:7 是素数 循环条件:从 2 开始 ,到输入的数字-1结束 循环操作:判断输入的数字能否被循环条件整除,能被整除,则不是素数,不能被整除,是素数 4、有一对兔子,从出生后的第3个月起都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假如兔子都不死的话,打印输出 前10个月,每个月有多少对兔子 n1 n2 n1 n2 n1 n2 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 2、三个表达式的特殊用法 1、for(;;) 三个表达式可以任意的省略,不推荐省略 2、for 第一个 和 第三个表达式的多样化 for(var i=1,j=2;i<=10;i++,j++) 练习: 1 + 6 = 7 2 + 5 = 7 3 + 4 = 7 4 + 3 = 7 5 + 2 = 7 6 + 1 = 7 for(var i=1,j=6;j>=1;i++,j--){ console.log(i+"+"+j+"="+(i+j)); } 3、嵌套循环 在一个循环的内部又出现一个循环 for(var i=0;i<10;i++){ // 外层循环 for(var j=0;j<10;j++){ // 内层循环 } } 外层循环执行一次,内层循环要执行一轮 练习: 1、控制台中输出下面的图形 ****** ****** ****** ****** ****** * ** *** **** ***** * *** ***** ******* ********* 2、数组 1、什么是数组 数组,即一组数据,使用一个变量来存放多个数据 数组中的元素是按照"线性"书序来排列的,所以也可以称之为是一个 "线性表" 2、声明数组 1、声明一个空数组变量 var 数组名 = []; 2、声明数组并赋初始值 var 数组名 = [数据1,数据2,数据3,... ...]; 3、声明一个空数组变量 var 数组名 = new Array(); 4、声明一个数组并赋初始值 var 数组名 = new Array(数据1,数据2,... ...); 练习: 1、创建一个函数,分别用两种不同的方式创建数组(arr1,arr2) arr1保存 :张三丰,张翠山,张无忌 arr2保存 :金花婆婆,殷素素,赵敏 2、直接将数组打印在控制台上 3、数组是引用类型的对象 引用类型的对象,是将数据保存在 "堆" 中的 在"栈"中,会对 "堆" 中数据的地址进行引用 1、将数组赋值给其它变量时,实际赋的是数组的地址 练习: 1、创建一个数组 arr1 ,包含"张无忌","赵敏" 2、将 arr1 赋值给 arr2 3、将 arr2 的第一个元素更改为 "金花婆婆",打印输出 arr1 和 arr2 中的所有元素 2、数组在做参数的时候,传递进去的实际上是地址(按引用传递 即 按地址传递) 练习: 1、创建一个数组array,保存"张无忌","赵敏"俩元素 2、创建一个函数change,接收一个数组作为参数,在函数体内,将第一个元素更改为"金花婆婆" 3、调用change函数,并将array数组作为参数,调用完成后,打印array的值,观察结果 4、修改change函数,在函数体内,将传递进来的数组重新new一个Array("孙悟空","猪八戒") 5、重复步骤三,观察结果 3、null 表示的是让引用类型的对象不再指向任何空间.一般用于主动释放对象的空间 //让 array 指向数组的地址 var array = ["wuji.zhang","zhaomin"]; //释放 array空间,不再指向任何地址 array = null; 4、访问数组的元素 赋值,取值,都是使用 下标 来完成的 1、为数组的元素赋值 数组名[下标] = 值; var array = ["张无忌","赵敏"]; array[1] = "周芷若"; array[2] = "小昭";//增加一个新元素,在第3个位置处 array[5] = "灭绝师太"; 2、获取数组中的值 数组名[下标]; 3、length属性 作用:获取数组的长度(数组中元素的个数) 1、允许将数组的length属性值设置为0,来完成数组元素的清空操作 2、配合循环 做数组的循环遍历操作 var array = ["张无忌","赵敏"]; 输出: 第1名 :张无忌 第2名 :赵敏 for(var i=0;i<array.length;i++){ console.log("第"+(i+1)+"名:"+array[i]); } 3、配合着数组,找到最新元素要插入的位置 var array = ["张无忌","赵敏"]; array[array.length] = "金花婆婆"; 作业: 1、定义一个函数,找出一个整数数组中的最大值 var nums = [38,5,62,789,12]; 该数组中的最大值为:789 推荐步骤: 1、声明函数 findMax,在函数体中,声明数组 2、声明一个变量 max,保存该数组中的最大值,并且设置数组的第一个元素为 max 的默认值 3、从第二个元素开始,依次与 max 进行比较,只要比max大,就赋值给max 2、定义一个函数,查找指定元素的位置(下标) var nums = [38,5,62,789,12]; 用户输入:12 该元素的下标为:4 用户输入:6 该元素不存在 var arr1 = [36,78]; var arr2 = arr1; var num1 = 10; var num2 = num1; console.log(); arr.length; 1、练习 要求用户手动的录入整数数字,并且保存到数组中,输入 exit 为止,并且查找该数组中的最大值是多少 请输入数字(exit退出):78 请输入数字(exit退出):56 请输入数字(exit退出):126 请输入数字(exit退出):35 ... ... 请输入数字(exit退出):exit 数组为:[78,56,126,35] 该数组中的最大值为:126 ================================================= 1、数组 1、使用 for ... in 遍历数组元素 语法: for(var 变量 in 数组){ //变量:表示的是数组中每个元素的下标 } 2、关联数组 php中 :$array = ["name"=>"sanfeng.zhang"]; 用字符串做下标,就是关联数组 var array = []; //声明一个空数组 array["西游记"] = "古代神话故事"; array["红楼梦"] = ["贾宝玉","林黛玉","刘姥姥"]; Q : array.length 注意: 1、关联数组是不算做数组内容的,不记录到 length 中 2、关联数组只能通过 字符串 做下标取值 3、允许通过 for...in 来循环遍历关联数组的字符串下标(也能遍历出内容的数字下标) 3、冒泡排序 [23,9,78,6,45] -> [6,9,23,45,78] 冒泡排序:车轮战,两两比较,小的靠前 特点: 1、轮数 :共比较了 length - 1 轮 2、每轮中比较的次数 :随着轮数的增加,次数反而减少 代码: 双层循环表示整个排序的过程 1、外层循环 :控制比较的轮数,从1开始,到length-1(能取到)结束 2、内层循环 :控制每轮中比较的次数,并且也要表示参与比较的元素的下标,从0开始,到 length-1-i(轮数变量) [23,9,78,6,45] 共5个元素 外层:从 1 开始,到 4 结束 内层: 第一轮 第一次:从 0 开始 ,到 3 结束 第二轮 第一次:从 0 开始 ,到 2 结束 ... ... 2、数组的常用方法 1、toString() 将一个数组转换为字符串 语法:var str = 数组对象.toString(); 2、join() 作用:将数组中的元素通过指定的分隔符连接到一起,并返回连接后的字符串 语法:var str = 数组对象.join("&"); 练习:(10分钟) 1、使用数组实现由 * 组成的三角形 直角三角形,等腰三角形 * ** *** **** ***** 2、使用数组实现 九九乘法表 3、连接数组 函数:concat() 作用:拼接两个或更多的数组,并返回拼接后的结果 语法:var result=arr1.concat(arr2,arr3,arr4); 注意: 1、concat不会改变现有数组,而是返回拼接后的 2、每个参数不一定非是数组,也可以是普通的数据 练习: 1、声明两个全局数组,分别保存一些国家的名称 数组1:选中的国家 sel = ["中国","美国","俄罗斯","日本"]; 数组2:备选国家 unsel=["朝鲜","越南","老挝","柬埔寨"]; 2、将 备选国家 全部移入到 入选国家中,打印数据 结果: sel = ["中国","美国","俄罗斯","日本","朝鲜","越南","老挝","柬埔寨"]; unsel=[]; 4、获取子数组 函数:slice() 作用:从指定数组中,截取几个连续的元素组成的新数组 语法:arr.slice(start,[end]); start:从哪个下标处开始截取,取值为正,从前向后取,取值为负,从后向前算位置。 0 1 2 3 var arr=["中国","美国","日本","英国"]; -4 -3 -2 -1 end : 指定结束处的下标(不包含),该参数可以省略,如果省略的话,就是从start一直截取到结束 注意: 1、该函数不会影响现有数组,会返回全新的数组 练习: var arr=["中国","美国","日本","英国"]; 取出 美国 和 日本 组成的一个子数组 5、修改数组 函数:splice() 作用:允许从指定数组中,删除一部分元素,同时再添加另一部分元素 语法: arr.splice(start,count,e1,e2,... ...); start:指定添加或删除元素的起始位置/下标 count:要删除的元素个数,取值为0表示不删除 e1,e2,... ... : 要增加的新元素,允许多个 返回值:返回一个由删除元素所组成的数组 注意:splice 会改变现有数组 练习: 在 sel 和 unsel 的基础上完成下列操作 1、从备选国家中(unsel),选择一个国家移入到 选中的国家(sel) 推荐步骤: 1、用户输入 :越南 从 unsel 中将越南移除 再将 越南 sel 的末尾处 2、用户输入 :墨西哥 提示:国家不存在 6、数组的反转 作用:颠倒数组中元素的顺序 语法:arr.reverse(); 注意:该函数会改变当前数组的内容 练习: 1、声明一个整数数组 2、倒序打印输出内容(使用reverse()) 7、数组排序 函数:sort(); 语法:arr.sort(排序函数); 作用:默认情况下,按照元素的Unicode码大小按升序排列 特殊:允许自己指定排序函数,从而实现对数字的升序和降序的排列 语法:arr.sort(排序函数); ex: var arr = [12,6,4,72,115,89]; //排序函数(升序) function sortAsc(a,b){ return a-b; } arr.sort(sortAsc); 原理: 1、指定排序函数 如 sortAsc,定义 两个参数,如 a 和 b。数组会自动传递数据到 sortAsc 里面去,如果返回值是>0的数,则交换两个数的位置,否则不变 使用匿名函数完成排序: arr.sort(function(a,b){return a-b;}); 练习: 1、声明一个整数数组,随意定义数字 2、页面上添加两个按钮,一个"升序"按钮,一个"降序"按钮 3、点击 升序 按钮时,数组按升序排序,并打印 4、点击 降序 按钮时,数组按降序排序,并打印 8、进出栈操作 JS是按照标准的"栈式操作"访问数组的 所有的"栈式操作"的特点都是"后进先出" "栈式操作"讲究的"入栈"和"出栈" 1、push() 入栈,在栈顶(数组的尾部)添加指定的元素,并返回新数组的长度 var arr = [10,20,30]; //向栈顶增加新数据 40 var len = arr.push(40); //len 保存的是 40 入栈后 arr 的长度,值是4 2、pop() 出栈,删除并返回栈顶的(数组尾部)元素 var arr = [10,20,30]; var r1 = arr.pop();//arr = [10,20] var r2 = arr.pop();//arr = [10] ============================== arr : r1 : 30 r2 : 20 3、shift() 删除数组头部的(第一个)元素并返回 var arr = [10,20,30]; var r1 = arr.shift(); ============================ arr : [20,30] r1 : 10 4、unshift() 作用:在数组的头部(第一个)元素位置处,增加新元素 var arr = [10,20,30]; arr.unshift(40); arr : [40,10,20,30] 3、二维数组 1、什么是二维数组 一个数组中的元素又是一个数组,也可以称之为:数组的数组 2、创建二维数组 var names=[ ["孙悟空","猪八戒","沙悟净"], ["潘金莲","西门庆","武大郎"], ["贾宝玉","刘姥姥","林黛玉"], ["貂蝉","貂蝉","貂蝉"] ]; //获取猪八戒 console.log(names[0][1]); //获取林黛玉 console.log(names[2][2]); 4、作业 1、通过 进出栈 操作,完成 十进制对二进制的转换 1、创建一个函数 decode2bin,接收一个十进制的数字做参数 2、函数体中,将参数 拆成二进制数字,保存在一个数组中 3、将数组的元素使用""连接,并返回 十进制 转 二进制 :除2取余法 num : 5 num % 2 : 结果为 1 num = parseInt(num / 2) : 结果 2 num % 2 : 结果为 0 num = parseInt(num / 2) : 结果 1 num % 2 : 结果为 1 num = parseInt(num / 2) : 结果 0 结果为 0 时则不用再继续 %2 2、根据省份信息,查询城市列表 1、创建一个全局数组,保存几个省份名称 2、创建一个全局二维数组,保存不同省份中的城市信息(数据要与省份数组中的数据对应的上) 3、创建一个函数,接收一个省份名称做参数,打印该省份中对应的所有的城市信息
41.98MB
PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2
2009-10-08书名:《PHP开发实战1200例(第I卷)》(清华大学出版社.潘凯华.刘中华) PDF格式扫描版,全书分为5篇15章,共899页。2011年1月出版。 全书压缩打包成2部分,这是第2部分。 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介 《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第I卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向对象等内容。本书分为5篇15章,共计625个实例和625个经验技巧。每个实例都经作者精心筛选,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。 本书适合PHP的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合PHP程序员参考、查阅。 目 录 目录: 第1篇 基础篇 第1章 开发环境 2 1.1 AppServ——PHP集成化安装包 3 实例001 通过AppServ配置PHP开发环境 3 实例002 AppServ应用技巧 6 实例003 第1个PHP程序 7 1.2 XAMPP——PHP集成化安装包 8 实例004 通过XAMPP配置PHP开发环境 8 实例005 测试XAMPP是否安装成功 11 实例006 XAMPP应用技巧 12 实例007 第2个PHP程序 13 1.3 IIS+PHP+MySQL——独立搭建PHP 开发环境 14 实例008 安装PHP 14 实例009 安装MySQL 15 实例010 安装IIS 21 实例011 第3个PHP程序 23 1.4 LAMP——独立配置PHP开发环境 24 实例012 安装Apache服务器 24 实例013 安装MySQL数据库服务器 26 实例014 安装PHP.50 28 实例015 第4个PHP程序 30 1.5 XAMPP——Linux版PHP集成化安装包 31 实例016 XAMPP——Linux下PHP开发环境的集成化 31 实例017 Linux操作系统下启动XAMPP 32 实例018 设置MySQL数据库root用户的密码 33 实例019 第5个PHP程序 34 1.6 Dreamweaver开发工具 35 实例020 Dreamweaver中编码格式的选择 35 实例021 Dreamweaver中创建表格 36 实例022 在表格中插入宠物照片 38 实例023 Dreamweaver创建表单 40 实例024 Dreamweaver中创建和附加CSS样式 42 实例025 Dreamweaver控制弹出信息 45 实例026 Dreamweaver控制浏览器的窗口 46 实例027 通过Dreamweaver创建站点 47 实例028 通过Dreamweaver开发第1个PHP程序 48 1.7 Zend Studio开发工具 50 实例029 安装Zend Studio 50 实例030 Zend Studio创建PHP项目 52 实例031 Zend Studio编码格式的转换 56 实例032 Zend Studio中快捷键的运用 57 实例033 Zend Studio中部署Apache服务器 60 第2章 PHP基础 63 2.1 基本语法 64 实例034 在页面中打印PHP的配置信息 64 实例035 在页面中打印服务器时间 65 实例036 在页面中打印当前执行的PHP文件名 67 实例037 区分单引号和双引号 68 实例038 动态输出JavaScript代码 69 实例039 当数字遇到了字符串 70 实例040 PHP程序员的基础——变量的应用 72 实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变变量输出“I Like PHP!” 73 实例043 使用转义字符输出特殊字符 74 实例044 使用常量指定PI的值计算圆的面积 75 2.2 运算符 75 实例045 自定义数字的加密/解密算法 76 实例046 比较两个时间戳的大小 77 实例047 使用条件运算符判断数字的奇偶性 78 实例048 判断用户是否具有后台管理权限 79 实例049 打印随机组合生日祝福语 80 实例050 打印2000~2020年的所有闰年 81 实例051 前置运算符和后置运算符的区别 82 实例052 使用位运算
66.35MB
2018最新微信墙微信上墙微信弹幕婚庆会议大屏幕3D签到抽奖摇一摇微信上墙源码
2018-01-162018最新微信墙微信上墙婚庆会议大屏幕3D签到抽奖摇一摇微信上墙源码。这是我在淘宝上面花了200大洋买的,php版本5.4以上,亲测可用,上墙,抽奖,摇一摇。都可以使用。绝对没有问题。之前在网上花了2天时间也找了一些类似的,有免费下载的,也有包括在csdn上面用5个资源分下载类似的,发现都不能用,至少我在本地或有服务器上都没有调试成功,看了一下他们的代码,发现代码用的是公众号帐号和密码,来模拟微信登陆来获取用户信息。微信已经在2016年就已经停止模似登陆了,登陆微信公众号,必须要扫描后,管理员确认后才可登陆。所以,那些代码都不能用。有些有csdn上传的这些代码基本上不能用(可能2015年前可以用,但是现在不能用),感觉太不负责任了,都是骗积分的。当时因为公司年会要弄个微信上墙及现在抽奖活动,找这个代码也很辛苦,相信大家也一样辛苦,所以,把代码放出来,供大家下载学习使用。这个代码,我是在淘宝上买的,本身内置了第三方的微信公众号授权,所以,如果你的公众号没有微信认证也可以用,直接扫码就可以发送微信上墙弹幕,不会出现第三方公众号信息。如果你的微信公众号认证了,就用自己的,后台可以配置,填写你的公众号appid和appsecret即可。好了,不多说了,大家下载使用,如果不能用,我退积分。不清楚的,大家可以在评论区留言。
13.65MB
2018年最火爆的微信墙源码
2018-12-012018最新微信墙微信上墙婚庆会议大屏幕3D签到抽奖摇一摇微信上墙源码。这是我在淘宝上面花了200大洋买的,php版本5.4以上,亲测可用,上墙,抽奖,摇一摇。都可以使用。绝对没有问题。之前在网上花了2天时间也找了一些类似的,有免费下载的,也有包括在csdn上面用5个资源分下载类似的,发现都不能用,至少我在本地或有服务器上都没有调试成功,看了一下他们的代码,发现代码用的是公众号帐号和密码,来模拟微信登陆来获取用户信息。微信已经在2016年就已经停止模似登陆了,登陆微信公众号,必须要扫描后,管理员确认后才可登陆。所以,那些代码都不能用。有些有csdn上传的这些代码基本上不能用(可能2015年前可以用,但是现在不能用),感觉太不负责任了,都是骗积分的。当时因为公司年会要弄个微信上墙及现在抽奖活动,找这个代码也很辛苦,相信大家也一样辛苦,所以,把代码放出来,供大家下载学习使用。这个代码,我是在淘宝上买的,本身内置了第三方的微信公众号授权,所以,如果你的公众号没有微信认证也可以用,直接扫码就可以发送微信上墙弹幕,不会出现第三方公众号信息。如果你的微信公众号认证了,就用自己的,后台可以配置,填写你的公众号appid和appsecret即可。好了,不多说了,大家下 载使用,如果不能用,我退积分。不清楚的,大家可以在评论区留言。
55.0MB
PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1
2016-06-14书名:《PHP开发实战1200例(第I卷)》(清华大学出版社.潘凯华.刘中华) PDF格式扫描版,全书分为5篇15章,共899页。2011年1月出版。 全书压缩打包成2部分,这是第1部分。 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介 《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第I卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向对象等内容。本书分为5篇15章,共计625个实例和625个经验技巧。每个实例都经作者精心筛选,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。 本书适合PHP的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合PHP程序员参考、查阅。 目 录 目录: 第1篇 基础篇 第1章 开发环境 2 1.1 AppServ——PHP集成化安装包 3 实例001 通过AppServ配置PHP开发环境 3 实例002 AppServ应用技巧 6 实例003 第1个PHP程序 7 1.2 XAMPP——PHP集成化安装包 8 实例004 通过XAMPP配置PHP开发环境 8 实例005 测试XAMPP是否安装成功 11 实例006 XAMPP应用技巧 12 实例007 第2个PHP程序 13 1.3 IIS+PHP+MySQL——独立搭建PHP 开发环境 14 实例008 安装PHP 14 实例009 安装MySQL 15 实例010 安装IIS 21 实例011 第3个PHP程序 23 1.4 LAMP——独立配置PHP开发环境 24 实例012 安装Apache服务器 24 实例013 安装MySQL数据库服务器 26 实例014 安装PHP.50 28 实例015 第4个PHP程序 30 1.5 XAMPP——Linux版PHP集成化安装包 31 实例016 XAMPP——Linux下PHP开发环境的集成化 31 实例017 Linux操作系统下启动XAMPP 32 实例018 设置MySQL数据库root用户的密码 33 实例019 第5个PHP程序 34 1.6 Dreamweaver开发工具 35 实例020 Dreamweaver中编码格式的选择 35 实例021 Dreamweaver中创建表格 36 实例022 在表格中插入宠物照片 38 实例023 Dreamweaver创建表单 40 实例024 Dreamweaver中创建和附加CSS样式 42 实例025 Dreamweaver控制弹出信息 45 实例026 Dreamweaver控制浏览器的窗口 46 实例027 通过Dreamweaver创建站点 47 实例028 通过Dreamweaver开发第1个PHP程序 48 1.7 Zend Studio开发工具 50 实例029 安装Zend Studio 50 实例030 Zend Studio创建PHP项目 52 实例031 Zend Studio编码格式的转换 56 实例032 Zend Studio中快捷键的运用 57 实例033 Zend Studio中部署Apache服务器 60 第2章 PHP基础 63 2.1 基本语法 64 实例034 在页面中打印PHP的配置信息 64 实例035 在页面中打印服务器时间 65 实例036 在页面中打印当前执行的PHP文件名 67 实例037 区分单引号和双引号 68 实例038 动态输出JavaScript代码 69 实例039 当数字遇到了字符串 70 实例040 PHP程序员的基础——变量的应用 72 实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变变量输出“I Like PHP!” 73 实例043 使用转义字符输出特殊字符 74 实例044 使用常量指定PI的值计算圆的面积 75 2.2 运算符 75 实例045 自定义数字的加密/解密算法 76 实例046 比较两个时间戳的大小 77 实例047 使用条件运算符判断数字的奇偶性 78 实例048 判断用户是否具有后台管理权限 79 实例049 打印随机组合生日祝福语 80 实例050 打印2000~2020年的所有闰年 81 实例051 前置运算符和后置运算符的区别 82 实例052 使用位运算
48KB
用php获取本周,上周,本月,上月,本季度日期的代码
2021-01-20PHP date函数参数详解 time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计算, 要找出前一天的时间就是 time()-60*60*24; 要找出前一年的时间就是 time()*60*60*24*365 那么如何把这个数字换成日期格式呢,就要用到date函数了 $t=time(); echo date(“Y-m-d H:i:s”,$t); 第一个参数的格式分别表示: a – “am” 或是 “pm” A – “AM” 或是 “PM” d – 几日,二位数字,若不足二位则前面补零; 如: “01” 至 “31” D –
65.97MB
2018最新微信墙微信上墙婚庆会议年会大屏幕3D签到抽奖摇一摇微信上墙源码
2018-12-172018最新微信墙微信上墙婚庆会议大屏幕3D签到抽奖摇一摇微信上墙源码。这是某人在淘宝上面花了200大洋买的,php版本5.4以上,亲测可用,上墙,抽奖,摇一摇。都可以使用。绝对没有问题。之前在网上花了2天时间也找了一些类似的,有免费下载的,也有包括在csdn上面用5个资源分下载类似的,发现都不能用,至少我在本地或有服务器上都没有调试成功,看了一下他们的代码,发现代码用的是公众号帐号和密码,来模拟微信登陆来获取用户信息。微信已经在2016年就已经停止模似登陆了,登陆微信公众号,必须要扫描后,管理员确认后才可登陆。所以,那些代码都不能用。有些有csdn上传的这些代码基本上不能用(可能2015年前可以用,但是现在不能用),感觉太不负责任了,都是骗积分的。当时因为公司年会要弄个微信上墙及现在抽奖活动,找这个代码也很辛苦,相信大家也一样辛苦,所以,把代码放出来,供大家下载学习使用。这个代码,我是在淘宝上买的,本身内置了第三方的微信公众号授权,所以,如果你的公众号没有微信认证也可以用,直接扫码就可以发送微信上墙弹幕,不会出现第三方公众号信息。如果你的微信公众号认证了,就用自己的,后台可以配置,填写你的公众号appid和appsecret即可。好了,不多说了,大家 下 载使用,如果不能用,我退积分。不清楚的,大家可以在评论区留言。
23.33MB
优能站长分类目录轻门户(60cms) T1.2
2019-11-08优能站长分类目录轻门户是一个以php+mysql进行开发的轻门户系统,适合于网站收录、网址导航、门户等。所谓轻门户系统,顾名思义就是要轻,而且内容方面有整合,也就是说整合了众多资源的小型门户系统。而优能轻门户系统质轻大家是有目共睹的,除去下载默认数据外,整个系统还不足5M,在cms系统的今天这已经非常的轻。那么优能轻门户系统整合了哪些内容呢?优能轻门户系统主要整合了新闻/微信/货源/商品/网站等内容的提交。优能站长分类目录轻门户系统特点:1、整合新闻自动采集,只要设置好采集规则,程序自动采集目标网站的新闻,让你的网站实时更新,从而黏住你的客户;2、其他所有版块支持火车头采集,方便建站初期整合大量数据,让网站获取更多内容收录和文章;3、程序轻小,全站除新闻外,全部伪静态,节约空间,不需要独立服务器,买个5G的空间足够你第一年的使用,等到赚到钱再买服务器不晚;4、高权重,快收录,部分客户建站不到半个月权重到1,建站第一天百度收录首页,全站个性化优化,对百度特别友好;5、管理方便,后台采用原生设计,没有多余的程序和代码,不用看着程序复杂不会使用,轻门户,使用简单,方便快捷,更容易上手;6、会
Java8零基础入门视频教程
2016-09-29这门课程基于主流的java8平台,由浅入深的详细讲解了java SE的开发技术,可以使java方向的入门学员,快速扎实的掌握java开发技术!
JavaEE+大数据+2个实战项目终极套餐震撼来袭
2017-05-19该套视频教程共包含16门课程,分别是Linux入门到精通、大型ERP项目实战教程、solr教程、Lucene教学视频、Java反射与注解开发、Hadoop大数据入门教程、Activiti工作流教程、redis高并发由浅入深、webservice入门教程、hibernate4入门教程、大型分布式redis+solr+Linux+nginx+springmvc+mybatis电商项目、struts2深入浅出、oracle入门到大神、springmvc深入浅出、spring 3.2教程、mybatis入门到精通教程、Java EE教程、Mysql教程。
Python金融数据分析入门到实战
2019-09-26<p> <strong><span style="font-size:16px;color:#003399;">会用Python分析金融数据 or 金融行业会用Python</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">职场竞争力更高</span></strong> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdnimg.cn/202012231042221925.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <strong><span style="font-size:16px;color:#003399;">Python金融数据分析入门到实战</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">Get√金融行业数据分析必备技能</span></strong> </p> <p> <img src="https://img-bss.csdnimg.cn/202012231042438069.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <strong><span style="font-size:16px;color:#003399;">以股票量化交易为应用场景</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">完成技术指标实现的全过程</span></strong> </p> <p> <br /> </p> <p> <span style="font-size:14px;">课程选取股票量化交易为应用场景,由股票数据的获取、技术指标的实现,逐步进阶到策略的设计</span><span style="font-size:14px;">和回测,由浅入深、由技术到思维地为同学们讲解Python金融数据分析在股票量化交易中的应用</span><span style="font-size:14px;">。</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <img src="https://img-bss.csdnimg.cn/202012231043183686.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <strong><span style="font-size:16px;color:#003399;">以Python为编程语言</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">解锁3大主流数据分析工具</span></strong> </p> <p> <br /> </p> <p> <span style="font-size:14px;">Python做金融具有先天优势,课程提取了Python数据分析工具NumPy、Pandas及可视化工具</span><span style="font-size:14px;">Matplotlib的关键点详细讲解,帮助同学掌握数据分析的关键技能。</span> </p> <p> <img src="https://img-bss.csdnimg.cn/202012231043472858.png" alt="" /> </p> <p> <strong><span style="font-size:16px;color:#003399;"><br /> </span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">2大购课福利</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;"><br /> </span></strong> </p> <p> <img src="https://img-bss.csdnimg.cn/202012300628195864.png" alt="" /> </p>
Python数据分析与机器学习实战
2017-01-24<p> <br /> </p> <p> Python数据分析与机器学习实战教程,该课程精心挑选真实的数据集为案例,通过python数据科学库numpy,pandas,matplot结合机器学习库scikit-learn完成一些列的机器学习案例。课程以实战为基础,所有课时都结合代码演示如何使用这些python库来完成一个真实的数据案例。算法与项目相结合,选择经典kaggle项目,从数据预处理开始一步步代码实战带大家入门机器学习。学完该课程即可: 1.掌握Python数据科学工具包,包括矩阵数据处理与可视化展示。 2.掌握机器学习算法原理推导,从数学上理解算法是怎么来的以及其中涉及的细节。 3.掌握每一个算法所涉及的参数,详解其中每一步对结果的影响。 4.熟练使用Python进行建模实战,基于真实数据集展开分析,一步步完成整个建模实战任务。 </p>
Javascript前端开发
2018-03-14JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
Java并发编程精讲
2019-09-28课程会讲解Java中并发相关技术的基础、原理和应用,从线程安全、线程(池),<br /> 锁实现和并发容器等高并发Java实现,去深入理解在并发编程中,<br /> 一些最容易被忽视的点,这些点也是我在多年编程经验中实际用到,<br /> 对于每个小节小课均会有实际的场景应用为你呈现。<br /> 同时这些也是面试过程中面试官考察的重点,掌握这些点,面试和工作时,做到心中有货,不慌不乱,能够胜任。<br />
WebSocket整合SpringBoot、SockJS、Stomp、Rabbitmq分布式消息推送
2020-04-28<p class="MsoNormal"> <span style="font-family:宋体;">(</span><span>1</span><span style="font-family:宋体;">)</span><span>HTML5 WebSocket</span><span style="font-family:宋体;">、异常重连、心跳检测;</span> </p> <p class="MsoNormal"> <span style="font-family:宋体;">(</span><span>2</span><span style="font-family:宋体;">)</span><span>SockJS</span><span style="font-family:宋体;">、</span><span>Stomp</span><span style="font-family:宋体;">、</span><span>RabbitMQ Stomp</span><span style="font-family:宋体;">消息代理;</span> </p> <p class="MsoNormal"> <span style="font-family:宋体;">(</span><span>3</span><span style="font-family:宋体;">)分别用</span><span>Nginx</span><span style="font-family:宋体;">和</span><span>Spring Cloud Gateway</span><span style="font-family:宋体;">实现多实例负载均衡;</span> </p> <p class="MsoNormal"> <span style="font-family:宋体;">(</span><span>4</span><span style="font-family:宋体;">)可靠消息推送(</span><span>Stomp</span><span style="font-family:宋体;">持久化队列、客户端</span><span>ACK</span><span style="font-family:宋体;">确认机制);</span> </p> <p class="MsoNormal"> <span style="font-family:宋体;">(</span><span>5</span><span style="font-family:宋体;">)</span><span>Java</span><span style="font-family:宋体;">原生、</span><span>Stomp</span><span style="font-family:宋体;">客户端实现(非浏览器客户端);</span> </p> <p class="MsoNormal"> <span style="font-family:宋体;">(</span><span>6</span><span style="font-family:宋体;">)</span><span>Websocket</span><span style="font-family:宋体;">拦截器结合</span><span> Spring security</span><span style="font-family:宋体;">、</span><span>jwt token</span><span style="font-family:宋体;">认证授权。</span> </p> <p class="MsoNormal"> <span style="font-family:宋体;">(</span><span>7</span><span style="font-family:宋体;">)</span><span>VUE+elementUI</span><span style="font-family:宋体;">前后分离实现。</span> </p>
- 偷偷地告诉学弟学妹们一个高效学习编程的秘密!大学四年悄悄惊艳他们,嘘 168692021-04-16今天来给大家谈一谈如何高效地学习编程。 无论什么时候,找到学习的目标,以及学习的套路都非常的重要。找不到的话,就只能事倍功半,付出了很多努力,却迟迟得不到最好的回报。 三四年前,我特别喜欢收藏文章,觉得有些技术文写得真好,忍不住收藏了!等过了一段时间后,闲得无聊,就去翻收藏夹,想着学一波,谁知道竟然找不到——不是微信给我删了,而是收藏夹里躺的“尸体”实在是太多了,根本就找不到。 后来,我就总结了一个小窍门——每周收藏夹里最多躺五篇文章,如果想进来第六篇,之前的必须得清一篇。别小看这个小窍门,它真的有督促我去
-
下载
333个中国地级市和省份对照表.xlsx
333个中国地级市和省份对照表.xlsx
-
下载
LDP建立过程.pcapng
LDP建立过程.pcapng
-
下载
申科股份:2020年年度报告.PDF
申科股份:2020年年度报告.PDF
-
下载
蓝桥杯嵌入式历年真题.zip
蓝桥杯嵌入式历年真题.zip
-
下载
华东医药:2020年年度报告.PDF
华东医药:2020年年度报告.PDF
-
下载
20210419-国盛证券-建筑材料行业:玻璃维持高景气,消费建材季报成长弹性显现.pdf
20210419-国盛证券-建筑材料行业:玻璃维持高景气,消费建材季报成长弹性显现.pdf
-
下载
新时达二代操作器的程序码(fj协议).hex
新时达二代操作器的程序码(fj协议).hex
-
下载
华阳国际:2020年年度报告.PDF
华阳国际:2020年年度报告.PDF
-
下载
codecode.zip
codecode.zip
-
下载
GDO-D2门机控制操作手册(调试人员用)CN.pdf
GDO-D2门机控制操作手册(调试人员用)CN.pdf
