北京总部

PHP入门学习——函数篇

PHP入门学习——函数篇

2017-01-09

要进行PHP入门学习,函数就是一个必会的东西了,下面这些你需要了解: 一、     函数的定义 //函数定义 function函数名([参数1,参数2,参数3,……]){ 函数体; [return返回值;] } //函数调用 函数名([参数1,参数2,参数3,……]); 例如: //定义函数sum functionsum($a,$b){ $sum_value=$a+$b; return$sum_value; } //调用函数sum sum(100,300); 说明 1.function:定义php函数关键字; 2.sum:函数名; 3.$a,$b:参数; 4.return:返回值得关键字($sum_value 返回值); 二、      可变函数 所谓可变函数,即通过变量的值来调用函数,因为变量的值是可变的,所以可以通过改变一个变量的值来实现调用不同的函数。经常会用在回调函数、函数列表,或者根据动态参数来调用不同的函数。可变函数的调用方法为变量名加括号。 function name() { echo 'jobs'; } $func = 'name'; $func(); //调用可变函数 三、内置函数 内置函数指的是PHP默认支持的函数,PHP内置了很多标准的常用的处理函数,包括字符串处理、数组函数、文件处理、session与cookie处理等。 例如:通过内置函数str_replace可以实现字符串的替换。下面的例子将“jobs”替换成“steven jobs”: $str = 'i am jobs.'; $str = str_replace('jobs', 'steven jobs',$str); echo $str; //结果为“i am steven jobs” 四、判断函数是否存在 1.function_exists判断函数是否存在 functionfunc() { } if(function_exists('func')){ echo'exists'; } 2.method_exists判断类的方法是否存在 3.class_exists判断类是否存在 classMyClass{ } // 使用前检查类是否存在 if(class_exists('MyClass')) { $myclass= new MyClass(); } 4.file_exists判断文件是否存在 $filename= 'test.txt'; if(!file_exists($filename)) { echo$filename . ' not exists.'; } 了解更多PHP入门学习知识请登录中软国际教育集团技术知识库!

更多>
PHP入门学习——类与面向对象篇

PHP入门学习——类与面向对象篇

2017-01-06

在PHP入门学习里,类与面向对象的相关知识你了解多少呢?一起来看看吧! 一、类的定义与对象创建 1.定义一个类 classCar { //定义属性 public$name = '汽车'; //定义方法 publicfunction getName() { //方法内部可以使用$this伪变量调用对象的属性或者方法 return$this->name; } 2、创建对象 第一种方式: $car = new Car(); 第二种方式:用变量来创建 $className = 'Car'; $car = new$className(); 二、访问控制 访问控制通过关键字public,protected和private来实现。 public:被定义为公有的类成员可以在任何地方被访问。 protected:被定义为受保护的类成员则可以被其自身以及其子类和父类访问。 private:被定义为私有的类成员则只能被其定义所在的类访问。 三、构造函数和析构函数 (1)PHP5可以在类中使用construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。 class Car { function construct() { print "构造函数被调用"; } } $car = new Car(); //实例化的时候 会自动调用构造函数__construct,这里会输出一个字符串。 在子类中如果定义了construct则不会调用父类的construct,如果需要同时调用父类的构造函数,需要使用parent::construct()显式的调用。 class Car { function construct() { print "父类构造函数被调用"; } } class Truck extends Car { function construct() { print "子类构造函数被调用"; parent::construct(); } } $car = new Truck(); (2)PHP5支持析构函数,使用destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。 class Car { function construct() { print "构造函数被调用 "; } function __destruct() { print "析构函数被调用 "; } } $car = new Car(); //实例化时会调用构造函数 echo '使用后,准备销毁car对象 '; unset($car); //销毁时会调用析构函数 当PHP代码执行完毕以后,会自动回收与销毁对象,因此一般情况下不需要显式的去销毁对象。 四、Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用。静态属性不允许对象使用->操作符调用。 class Car { private static $speed = 10; public static function getSpeed() { return self::$speed; } } echo Car::getSpeed(); //调用静态方法 静态方法也可以通过变量来进行动态调用 $func = 'getSpeed'; $className = 'Car'; echo $className::$func(); //动态调用静态方法 静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。 class Car { private static $speed = 10; public static function getSpeed() { return self::$speed; } public static function speedUp() { return self::$speed+=10; } } class BigCar extends Car { public static function start() { parent::speedUp(); } } BigCar::start(); echo BigCar::getSpeed(); 五、对象继承与重载 建立一个Truck类,扩展Car类,并覆盖speedUp方法,使速度累加50 classCar { public$speed = 0; //汽车的起始速度是0 publicfunction speedUp() { $this->speed+= 10; return$this->speed; } } //定义继承于Car的Truck类 classTruck extends Car{ publicfunction speedUp() { $this->speed= parent::speedUp()+50; return$this->speed; } } $car= new Truck(); $car->speedUp(); echo$car->speed; (2)重载 PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。属性的重载通过set,get,isset,unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。 class Car { private $ary = array(); publicfunction __set($key, $val) {     $this->ary[$key] = $val; }   publicfunction __get($key) {     if (isset($this->ary[$key])) {         return $this->ary[$key];     }     return null; }   publicfunction __isset($key) {     if (isset($this->ary[$key])) {         return true;     }     return false; }   publicfunction __unset($key) {     unset($this->ary[$key]); } } $car = new Car(); $car->name = '汽车'; //name属性动态创建并赋值 echo $car->name; 方法的重载通过call来实现,当调用不存在的方法的时候,将会转为参数调用call方法,当调用不存在的静态方法时会使用__callStatic重载。 class Car { public $speed = 0; publicfunction __call($name, $args) {     if ($name == 'speedUp') {         $this->speed += 10;     } } } $car = new Car(); $car->speedUp(); //调用不存在的方法会使用重载 echo $car->speed; 了解更多PHP入门学习知识欢迎访问中软国际教育集团技术知识库,邀上小伙伴们一起来吧!

更多>
PHP入门学习——字符串操作

PHP入门学习——字符串操作

2017-01-05

字符串操作可以说是PHP入门学习中比较常用,也是比较基础的一项了,那么在PHP入门学习中都有哪些字符串的操作需要我们注意的呢? 1.单引号和双引号的区别 在PHP中,字符串的定义可以使用英文单引号' ',也可以使用英文双引号" "; $str='hello'; echo "str is $str"; //运行结果: str is hello echo 'str is $str'; //运行结果: str is $str 2.去除字符串首尾的空格 trim去除一个字符串两端空格。echo trim(" 空格 ")." "; rtrim是去除一个字符串右部空格,其中的r是right的缩写。echo rtrim(" 空格")." "; ltrim是去除一个字符串左部空格,其中的l是left的缩写。echo ltrim(" 空格")." "; 3.字符串的连接 用英文的点号.来连接两个字符串。 $hello='hello'; $world=' world'; $hi = $hello.$world; 4.获取字符串的长度 使用mb_strlen()函数获取字符串中中文长度。echomb_strlen('我爱你',"UTF8"); 使用strlen()函数获取字符串中英文长度。echo strlen('hello'); 5.字符串的截取 英文字符串截取函数substr(字符串变量,开始截取的位置,截取个数); echo substr('i love you', 2, 4); 中文字符串截取函数mb_substr(字符串变量,开始截取的位置,截取个数); echo mb_substr('我爱你,中国', 4, 2, 'utf8'); 6.查找字符串 函数说明:strpos(要处理的字符串, 要定位的字符串, 定位的起始位置[可选]) 7.替换字符串 函数说明:str_replace(要查找的字符串, 要替换的字符串, 被搜索的字符串, 替换进行计数[可选]) 将错误的Chian替换为China: echo str_replace('Chian','China','I Love Chian'); 8.格式化字符串 函数说明:sprintf(格式, 要转化的字符串) echo sprintf('%01.3f','100.1'); -->100.100 sprintf('%01.2f', '99.9'); 这个 %01.2f 是什么意思呢? %:起始字符,表示指定格式开始。 0:跟在 % 符号后面的是 0, 是 "填空字元" ,表示如果位置空着就用0来填满。 1:规定整个所有的字符串占位要有1位以上(小数点也算一个占位)。如果把 1 改成 6,则 $result的值将为 099.90 。 因为,在小数点后面必须是两位,99.90一共5个占位,现在需要6个占位,所以用0来填满。 .2 :小数点后的数字必须占2位。 如果这时候,$str 的值为9.234,则 $result的值将为9.23. f:以 f "转换字符" 结尾。 9.字符串的转义 php字符串转义函数addslashes() 函数说明:用于对特殊字符加上转义字符,返回一个字符串 返回值:一个经过转义后的字符串 $str = "what's your name?"; echo addslashes($str);//输出:what's your name? 10.字符串的合并与分割 (1) php字符串合并函数implode(): 函数说明:implode(分隔符[可选], 数组) 返回值:把数组元素组合为一个字符串 $arr = array('Hello', 'World!'); $result = implode('', $arr); print_r($result);//结果显示Hello World! (2)php字符串分隔函数explode() 函数说明:explode(分隔符[可选], 字符串) 返回值:函数返回由字符串组成的数组 $str = 'apple,banana'; $result = explode(',', $str); print_r($result);//结果显示array('apple','banana') 以上就是PHP入门学习中常用的字符串操作了,想学习和了解更多PHP入门学习知识请登录中软国际教育集团技术知识库!

更多>
PHP入门学习——关于数组

PHP入门学习——关于数组

2017-01-05

关于数组的PHP入门学习您掌握了多少呢,一起来看看下面的内容吧! 一、数组创建 创建一个空数组,并赋值给$arr:$arr=array(); 二、索引数组赋值的三种方式: 1.$arr=array(); $arr[0]="苹果"; $arr[1]="梨子"; $arr[2]="香蕉"; 2.$arr=array('0'=>'苹果','1'=>'梨子','2'=>'香蕉'); 3.$arr=array('苹果','梨子','香蕉'); 三、循环访问数组值方式 (1)循环访问索引数组里的值得方式: 第一种:for循环 $fruit=array('苹果','香蕉','菠萝'); for($i=0; $i<3; $i++){ echo ' 数组第'.$i.'值是:'.$fruit[$i]; } 第二种:foreach循环 foreach($fruit as $k=>$v){ echo ' 第'.$k.'值时:'.$v; } (2)用foreach循环访问关联数组里的值。 $fruit=array('apple'=>"苹果",'banana'=>"香蕉",'pineapple'=>"菠萝"); foreach($fruit as $k=>$v){ echo ' 水果的英文键名:'.$k.',对应的值是:'.$v; } 了解更多PHP入门学习知识欢迎访问中软国际教育集团技术知识库!

更多>
web前端工程师:探索移动Web网页编码设计

web前端工程师:探索移动Web网页编码设计

2017-01-04

◆ 为了移动设备上的用户体验可以被接受,web前端工程师代码得怎么设计。 ◆ “Mobile Web”与普通网站的不同之处? ◆ 可以让网站成功运行在移动设备和桌面浏览器上的基本技巧 ◆ 一些Mobile Web设计中的建议和禁忌、以及大量资源 Mobile Web和普通网站到底有何不同呢? 这是个很好的问题 – 首先,也许我们应该从“什么是Mobile Web”的问题开始。毕竟,用户用移动设备访问的Mobile Web,跟他们在家里用台式机访问的网站是独立的不同的部分。当我说“Mobile Web”时,我指的是“通过移动设备访问的网站”。 在Opera,我们全身心投入而创造出的浏览器允许你查看整个网络,不管浏览设备是否有这个能力。只要你在建立网站时,付出一点儿细心、尊敬并遵循 Web标准,你就可以为所有人所有设备创建只有一个版本的网站 – 唯一的一个网站。但是,有一些例外情况 – 在某些情况下,只有分版本的网站才行得通,一会你会看到这一点。 移动领域的竞争环境并不平衡 在桌面领域,对于我们前端开发者来说,形式正在好转 – 大多数现代浏览器已经对Web标准支持的非常好了,无论是Opera、firefox(以及其他Gecko内核浏览器)或者Safari(以及其他 Webkit内核浏览器),甚至IE带给我们的痛苦都比原来少了。虽然IE6的用户群体数量仍然非常杯具,但这应该归结于大多数人封闭的使用习惯等因素。 但是,移动设备领域在这方面却是不同寻常的: ◆  你拥有能为“Full Web”提供支持的浏览器,像iphone上的Opera Mobile和Safari。Opera Mobile使用了与桌面版本相同的渲染引擎,所以对标准的支持相差无几。 ◆  你拥有并不很爽的浏览器,例如IE,它们对Web标准仅能提供有限的支持。它们中的一部分只支持WAP(例如WinWap),另一些支持其他像 Chtml或HTML-MP这样的标准(例如日本NTT DoCoMo的iMode浏览器),还有一些只支持Web标准中的有限子集(例如Netfront、Pocket IE、以及Blazer)。 ◆  最后,你拥有OperaMini, 以及其他通过代理机制的浏览器。它主要只是作为连接用户和一个大服务器群的客户端界面。当用户提交一个URL时,客户端会让服务端查找这个页面。然后它会 把页面转换成一个轻量级的二进制标记语言,将它格式化成适合移动设备查看的形式,并发送回客户端显示。这种方式的最主要优势,是可以使页面体积减少90% 左右,帮助用户节省很多带宽费用。这种标记语言表明Web标准并不能很好的表现在移动设备上,因为在这种服务的方式下,OperaMini对 ajax/javascript某些方面将支持的不是很好 – 在这儿有更详细的解释。 注意:不要指望你的超级Ajax和DOM脚本动画网站在移动设备上会有良好表现。JavaScript在移动设备上的支持程度千差万别。时刻提供优雅降级吧。这种做法有一个例子叫做Hijax。 我们可以看到,在移动设备的跨浏览器兼容方面,你要思考的问题有很多。但是不要怕 – 我随后的建议会给你指引一个正确的方向;并且随着时间的推移,移动浏览器对标准的支持将会得到改善,届时我们前端开发者真的再也不需要为它们操心了。你问 我这一切什么时候会实现?Who knows! 移动浏览器的其它限制还有那些? 当然,在移动设备上开发网站时,除了浏览器对标准的支持外,还会遇到其它更多的限制因素。设备自身的限制因素,你也不得不考虑。例如: ◆  有限的控制 – 不要只假设你的用户会使用鼠标来控制页面中的一切,你也要提供键盘的选择。一些手机用户可能没有类似鼠标这样的东东,所以类似这样的结构 :hover 以及 onClick 对 他们来说是没有用的(这对可用性方面也是非常重要的 – 一些残障用户可能在用手方面会有些缺陷)。为用户提供的表单设计也同样重要 – 你可能已经感受到,用手机来填写那些又臭又长的必填表单有多么不爽。为了解决这个问题,试着去把那一坨内容用下拉菜单的方式展现出来,这比等着用户一个字 一个字手动输入来的更靠谱(译者注:目前国内有某些山寨机浏览器对下拉菜单的支持可能有不同程度的问题。例如基于MTK系统的联想i61,默认情况下会显示所有选项,而在某些情况下会产生变形和“漂移”,使用时需要谨慎些)。另外,给表单设置一个最有可能的初始值,也是一个好主意。 ◆  有限的屏幕尺寸 – 想象一下你那美妙的1024×768的设计在240×320屏幕下,或者更小的屏幕下,它的可用性会是什么样子……有一些方法可以应对这个情况 – 你可以故意把页面设计的很简洁流畅,或者你可以通过采取功能检测或媒体类型检测(诸如此类)的手段,为移动设备提供不同的页面。另外对于屏幕尺寸,有些手 机可能不需要这么麻烦,它们可能会提供“缩放模式”这样的机制,但是你却不能保证这一点。 ◆  有限的内存和带宽 – 移动设备所提供的可用内存明显比台式机少得多。因此,在你设计站点时,需要特别小心的考虑那些超大容量的相册图片,以及交互式流媒体视频的应用程序。此外,一些移动浏览器提供了关闭图像显示的选项,但是你也同样不能确定这一点。 ◆  有限的排版 – 我靠,你对台式机上那些排版非常痴情?你没有看到移动设备上的表现!虽然这条规则有很多例外情况,但大多数移动设备对字体的选择非常有限,只有一两种(like 1 or 2)。这个限制是由系统或浏览器决定的。 ◆  有限的颜色 – 一些移动设备在颜色方面的支持也非常有限。考虑你有多少页面的体验需要依赖于颜色,并确认那些对比色在移动设备上仍然支持。 这些限制因素,就是导致Mobile Web的体验与PC Web的体验不同之处的真正原因。千万别欺骗自己,觉得自己的网站在移动设备上的用户体验与台式机上会保持一致 – 这纯属YY。当然,你抛开浏览器,千方百计去确认用户体验这一点仍然值得肯定。 真正的办法,去确保你的网站为移动用户提供一个良好的体验,是测试,测试,再测试!一些Web设计师们已经认识到,除了他们自己的手机、台式机以及游戏机浏览器外,还需要有一大堆移动设备需要准备在手头。 解决问题的不同方法 人们普遍意识到,有三种办法可以解决移动开发的问题(已经被Cameron Moll证实了 – 找他的书看看)。可能的话,我建议你试试这三种方式 – 如前所述,在Opera,我们坚持相信One Web的理念 – 但是刚才我也说过,有些情况下这是很难实现的,或者也是没有必要的。下面是这三种方法: ◆  务必坚持遵循Web标准 ◆  创建一个完全独立的移动网站 ◆  只创建一个站点(One Web),但是根据浏览它的设备和浏览器情况,添加优化代码。 现在,让我们开始对这些点逐个讲解。 坚持遵循Web标准和最佳实践 一个好网站的基础,是要有一个好的HTML结构,以及美妙的CSS(表现)和JavaScript(行为)。如果你认真地遵循Web标准,大多数移动浏览器至少会很好地解析并至少会基本可用,这是非常有可能的。例如: ◆  一个网站,有良好的HTML结构顺序并在HTML中没有装饰性图片,在移动浏览器的单列模式或移动模式中,会呈现得很有逻辑性。 ◆  如果你的表单元素中含有“label”元素,浏览器将把它渲染得更有表单区域的感觉。 ◆  如果你给CSS和JavaScript使用了优雅降级/渐进增强技术,浏览器如果不支持、简化、忽略某些属性,这时站点的可用性几率会大大增加。 如果你花费时间精力去研究的话,在提升移动用户体验方面,还有更多事情可以去做。如果你的目标受众包括大量使用非HTML浏览器(例如支持WAP或CHTML的某些日本浏览器)用户,那么你可能不得不检测设备并提供适当的内容。 提供一个完全独立的移动网站 如前所述,我认为如果可能的话应该尽量避免使用这种方式。你可以做设备检测并自动重定向来避免给用户使用带来麻烦,但是这意味着你不得不维护两套网站。最主要的方法是通过UA嗅探来识别浏览器,或在服务端进行设备功能检测,然后再给用户提供相应的站点。在dev.opera.com,有很多优秀的文章来讲述如何实现 – 查看最后的资源部分。 但也有例外,对于完全独立的网站来讲 – 你不得不始终考虑用户体验情况。某些类型的浏览设备可能不兼容于特定的网站或者特定的功能。例如,有一个大学校园网,带有部门电话号码的搜索功能,但同时 也包含了一大堆校园历史的网页。如果你想去与某人会面却找不到他们部门时,你大概会想在移动设备上使用搜索功能,但你在外出的时候也不太可能想坐下来阅读 那么多的文字。 在这种情况下,你可以使用下面提到的一些技巧,来为移动设备提供网站中某个功能的一部分,或者干脆为移动设备创建一套完全独立的网站。你只需检测用 户使用的设备类型并自动提供给他相应的站点,并把这个过程完全公开给用户,但是很多很多人并不愿意这个功能把他们完全限制住,所以如果你要这么做的话,就 需要给用户提供一个指向完整站点的链接,用户可以自行选择是否用它来访问完整站点。 一句话警告 – 设备检测很容易被滥用。你可能经常看到一个网站的桌面版本非常牛B,而它的移动站点却非常的垃圾。因为开发者只是将移动站点放在一个非常低标准的位置上。 事实上,目标受众的设备水平并不均衡,现在很多的移动浏览器都具有处理完整Web页面的能力了!你应该尽可能地让设备发挥他们最高的处理能力,并且要发挥 移动设备的特别优势,比如基于位置的服务(LBS),还有 tel: 协议 – 在超链接点击时它可以让设备拨打一个电话号码。 只提供一个网站(One Web) 进行到这里时,就开始变得有趣了。你可以再次依靠服务端功能检测,但这次是在单一网站的基础上进行优化,而不是重定向到另一个独立网站。有一些手机所支持功能的数据库可以参考,例如WURFL。它是以XML文件的形式开放的,你可以在设计优化内容之前,先通过它来查询设备所支持的功能。你还可以查询移动设备的UA字符串,找出这些设备的其他细节参数,例如是否有摄像头,屏幕尺寸是多少,以及它的语言种类等信息。 在客户端,你已经得到了为移动设备而优化内容所需的两个条件 – 媒体类型(media types)和媒体查询(media queries)。 媒体类型(media types) 就像你知道的那样,你可以指定不同的CSS来实现不同的用途,例如: 手持类的媒体类型允许你针对移动设备使用优化版的样式(例如精简的布局和排版等)。这是一个被支持得很好的机制,实现起来也很简单,但它确实有它的 缺陷。就像之前所说,它经常被开发者滥用,来给网站提供一个蹩脚的最低标准布局。事实上,OperaMini最近改变了默认类型,把默认使用手持型样式表 (handheld stylesheet)改为屏幕型样式表(screen stylesheet)。OperaMini可以处理大多数完整网站,因此它并不真正需要使用手持型样式表(handheld stylesheet)。如果你乐意,你可以在OperaMini的浏览器选项中手动设置回移动视图。 媒体查询(media queries) 媒体查询是CSS3的一个构想,它的用途跟条件注释非常相似 – 你可以把一大堆CSS规则封装嵌入到一个媒体查询中,然后把它应用到你的标记结构中,这一切取决于一个条件,类似“屏幕尺寸是否小于480px?”然后把代码放进去,代码类似这样: 1. img {    2. margin: 0 0 10px 10px;    3. float: right;    4. }   5. @media all and (max-width: 480px) {    6. img {    7. margin: 10px auto;    8. float: none;    9. display: block;    10. }    11. }   你甚至可以使用多个媒体查询,像下面这样: 1. body {   2. max-width:800px;   3. font-family:georgia, serif;   4. }   5. img {   6. margin:0 0 10px 10px;   7. float:right;   8. }   9. .info {   10. position:absolute;   11. left:8000px;   12. }   13. @media all and (max-width: 480px) {   14. img {   15. margin:10px auto;   16. float:none;   17. display:block;   18. }   19. }   20. @media all and (max-width: 240px) {   21. img {   22. display:none;   23. }   24. .info {   25. position:static;   26. }   27. }  OK,在这个例子中(源代码点击这里查看),浏览器中的图片在屏幕大于480px时会向右浮动,文本会环绕图片并通过外边距留出一点儿舒服的距离(另有一个信息隐藏在 p 元素中,并命名了一个 class 叫 info - 看看HTML代码)。文本流在一些小屏幕中看起来可能会有些蹩脚,因为那里没有足够的空间来让图片和定量的文本放置在同一行中,所以当屏幕小于480px时,图片就需要改变一下,让文本不再围绕在它旁边,而是用 display:block 让它们显示在不同行中。等等 – 还有更精彩的!如果屏幕非常小以至于不能有效地展示图片,那就让它们消失,然后让隐藏信息显示在图片那儿,替代那些图片显示文本描述 – 这是一种将信息传达给读者的一种另类技巧,利用它也可以为那些使用屏幕阅读器的盲人用户提供原始文本,以便他们顺利浏览网站。图1展示了三个不同的浏览视 图,这是在那些支持媒体查询的浏览器中(例如Opera 9.5)表现出的不同形式。 图1:例子中三个不同的浏览模式 听起来挺好,但是有没有不足呢?好吧,目前浏览器对媒体查询的支持程度非常有限。Opera浏览器支持它们,Safari 3也可以(以及其它基于Webkit内核的现代浏览器),但是Firefox 3之前的版本并不支持,IE或其他浏览器也不支持。解决问题的方法之一,是使用媒体类型和媒体查询的组合。 想成为web工程师就来中软国际教育集团技术知识库,来这里可以探索移动web网页编码设计

更多>
web前端工程师:5分钟学会Web自适应

web前端工程师:5分钟学会Web自适应

2017-01-04

  特别说明:在开始这一切之前,请开发移动界面的工程师们在头部加上下面这条meta:     所谓宽度自适应严格来说是一种PC端的自适应布局方式在移动端的延伸。在处理PC端的前端界面时候需要用到全屏布局时采用的就是此种布局方式。它的实现方式也比较简单,将外层容器元素按照百分比铺满地方式,里面的子元素固定或者左右浮动。     由于父级元素采用百分比的布局方式,随着屏幕的拉伸,它的宽度会无限的拉伸。而子元素由于采用了浮动,那么它们的位置也会固定在两端。该宽度自适应在新的时代有了新的方法,随着弹性布局的普及,它经常被flex或者box这样的伸缩性布局方式替代,变得越来越“弹性”十足。     “完全自适应式”是卤煮对此方案的叫法,由于卤煮现在找不到官方名称,所以暂时就这样叫它。     这种解决方案相对前一种来说进步不少,不仅仅宽度实现了自适应,而且界面所有的元素大小和高度都会根据不同分辨率和屏幕宽度的设备来调整元素、字体、图片、高度等属性的值。简单来说就是在不同的屏幕下,你看到的字体和元素高宽度的大小是不一样的。     在这里,有人就会说利用的是媒体查询熟悉,根据不同的屏幕宽度,调整样式。卤煮之前也是这样想的,但是你需要考虑到界面上的许多元素需要设置字体,如果用media query为每个元素在不同的设备下都设置不同的属性的话,那么有多少种屏幕我们的css就会增加多少倍。实际上在这里,我们采用的是js和css熟悉rem来解决这个问题的。     REM属性指的是相对于根元素设置某个元素的字体大小。它同时也可以用作为设置高度等一系列可以用px来标注的单位。     采用以上写法,div继承到了html节点的font-size,为本身定义了一系列样式属性,此时1em计算为10px,即根节点的font-size值。     所以,这时div的高度就是20px,宽度是30px,边框是1px,字体大小则是10px;一旦有了这样的方法,我们自然可以根据不同的屏幕宽度设置不同的根节点字体大小。     假设我们现在设计的标准是iphone5s,iphone5系列的屏幕分辨率是640。为了统一规范,我们将iphone5 分辨率下的根元素font-size设置为100px;      那么以此为基准,可以计算出一个比例值6.4。我们可以得知其他手机分辨率的设备下根元素字体大小:     在head中,我们将以上代码加入,动态地改变根节点的font-size值,得到如下结果:     接下来我们可以根据根元素的字体大小用rem设置各种属性的相对值。当然,如果是移动设备,屏幕会有一个上下限制,我们可以控制分辨率在某个范围内,超过了该范围,我们就不再增加根元素的字体大小了:      动态地拉伸和收缩。当然,假如用户开启了转屏设置,在网页加载之后改变了屏幕的宽度,那么我们就要考虑这个问题了。解决此问题也很简单,监听屏幕的变化就可以做到动态切换元素样式:     为了提高性能,让代码开起来更加完美,可以为它加上节流阀函数:     顺带解决高保真标注与实际开发值比例问题     如果你们设计稿标准是iphone5,那么拿到设计稿的时候一定会发现,完全不能按照高保真上的标注来写css,而是将各个值取半,这是因为移动设备分辨率不一样。     设计师们是在真实的iphone5机器上做的标注,而iphone5系列的分辨率是640,实际上我们在开发只需要按照320的标准来。为了节省时间,不至于每次都需要将标注取半,我们可以将整个网页缩放比例,模拟提高分辨率。这个做法很简单,为不同的设备设置不同的meta即可:     这样设置同样可以解决在安卓机器下1px像素看起来过粗的问题,因为在像素为1px的安卓下机器下,边框的1px被压缩成了0.5px了。总之是一劳永逸!淘宝和网易新闻的手机web端就是采用以上这种方式,自适应各种设备屏幕的,大家有兴趣可以去参考参考。下面是完整的代码:     运用css新属性media query 特性也可以实现我们上说到过的布局样式。为尺寸设置根元素字体大小:      这种方式也是可行的,缺点是灵活性不高,取每个设备的精确值需要自己去计算,所以只能取范围值。考虑设备屏幕众多,分辨率也参差不齐,把每一种机型的css代码写出来是不太可能的。但是它也有优点,就是无需监听浏览器的窗口变化,它会跟随屏幕动态变化。媒体查询的用法当然不仅仅像在此处这么简单,相对于第二种自适应来说有很多地方是前者所远远不及的。最明显的就是它可以根据不同设备显示不同的布局样式!请注意,这里已经不是改变字体和高度那么简单了,它直接改变的是布局样式!     此种自适应布局一般常用在兼容PC和手机设备,由于屏幕跨度很大,界面的元素以及远远不是改改大小所能满足的。这时候需要重新设计整界面的布局和排版了: 如果屏幕宽度大于1300像素,如下图。     如果屏幕宽度在600像素到1300像素之间,则6张图片分成两行。      如果屏幕宽度在400像素到600像素之间,则导航栏移到网页头部。      许多css框架经常用到这样的多端解决方案,著名的Bootstrap就是采用此种方式进行栅格布局的。     不管哪一种自适应方式,我们的目的是使得开发网页在各种屏幕下变得好看:如果你的项目定位的用户群仅仅是使用某种机型的人,那么可以采用第一种自适应方式。     如果你的客户主要是移动端,但是客户的设备类型庞杂,建议采用第二种方式。如果你雄心勃勃地需要建立一套兼容PC、PAD、mobile多端的一体化web应用,那么第三种选择显然是最适合你的。每种方式都有自己的利弊,根据需求权衡利害,合理地实现自适应布局,需要不停的实践和摸索。路漫漫其修远兮,吾将上下而求索。     想成为web前端工程师吗,来中软国际教育集团技术知识库,5分钟学会Web自适应!

更多>
iOS开发入门——17条 Swift 最佳实践规范(下)

iOS开发入门——17条 Swift 最佳实践规范(下)

2016-12-30

承接上文:iOS开发入门——17条 Swift 最佳实践规范(上) 9.单例(Singletons) 在Swift中单例是很简单的: class ControversyManager {    static let sharedInstance = ControversyManager()} Swift 的 runtime 会保证单例的创建并且采用线程安全的方式访问。       单例通常只需要访问"sharedInstance"的静态属性,除非你有不得已的原因去重命名它。注意,不要用静态函数或者全局函数去访问你的单例。 (因为在 Swift 中单例太简单了,并且持续的命名已经耗费了你太多的时间,你应该有更多的时间去抱怨为什么单例是一个反模式的设计,但是避免花费太多时间,你的同伴会感谢你的。) 10.使用扩展来组织代码       扩展应该被用于组织代码。       一个实例的次要方法和属性应该移动到扩展中。注意,现在并不是所有的属性类型都支持移动到扩展中,为了做到最好,你应该在这个限制中使用扩展。       你应该使用扩展去帮助组织你的实例定义。一个比较好的例子是,一个 view controller 继承了 table view data source 和 delegate protocols 。为了使table view中的代码最小化,把 data source 和 delegate 方法整合到扩展中以适应相应的 protocol 。       在一个单一的源文件中,在你觉得能够最好地组织代码的时候,把一些定义加入到扩展中。不要担心把 main class 的方法或者 struct 中指向方法和属性定义的方法加入扩展。只要所有文件都包涵在一个 Swift 文件中,那就是没问题的。       反之,main 的实例定义不应该指向定义在超出 main Swift 文件范围的扩展的元素。 11.链式 Setters        对于简单的 setters 属性,不要使用链式 setters 方法当做便利的替代方法。 正确的做法: instance.foo = 42instance.bar = "xyzzy" 错误的做法: instance.setFoo(42).setBar("xyzzy")        相较于链式setters,传统的setters更为简单和不需要过多的公式化。 12.错误处理        Swift 2.0 的 do/try/catch 机制非常棒。 13.避免使用try! 一般来说,使用如下写法: do {    try somethingThatMightThrow()}catch {    fatalError("Something bad happened.")} 而不是: try! somethingThatMightThrow()        即使这种形式特别冗长,但是它提供了context让其他开发者可以检查这个代码。        在更详尽的错误处理策略出来之前,如果把 try! 当做一个临时的错误处理是没问题的。但是建议你最好周期性地检查你代码,找出其中任何有可能逃出你代码检查的非法try!。 14.避免使用try?        try?是用来“压制”错误,而且只有当你确信对错误的生成不关心时,try?才是有用的。一般来说,你应该捕获错误并至少打印出错误。 15.过早返回&Guards        可能的话,使用guard声明去处理过早的返回或者其他退出的情况(例如,fatal errors 或者 thorwn errors)。 正确的写法: guard let safeValue = criticalValue else {    fatalError("criticalValue cannot be nil here")}someNecessaryOperation(safeValue) 错误的写法: if let safeValue = criticalValue {    someNecessaryOperation(safeValue)} else {    fatalError("criticalValue cannot be nil here")} 或者: if criticalValue == nil {    fatalError("criticalValue cannot be nil here")}someNecessaryOperation(criticalValue!)        这个flatten code以其他方式进入一个if let 代码块,并且在靠近相关的环境中过早地退出了,而不是进入else代码块。        甚至当你没有捕获一个值(guard let),这个模式在编译期间也会强制过早退出。在第二个if的例子里,尽管代码flattend得像guard一样,但是一个毁灭性的错误或者其他返回一些无法退出的进程(或者基于确切实例的非法态)将会导致crash。一个过早的退出发生时,guard声明将会及时发现错误,并将其从else block中移除。 16."Early"访问控制        即使你的代码没有分离成独立的模块,你也应该经常考虑访问控制。把一个定义标记为 private 或者 internal 对于代码来说相当于一个轻量级的文档。每一个阅读代码的人都会知道这个元素是不能“触碰”的。反之,把一个定义为 public 就相当于邀请其他代码去访问这个元素。我们最好显示地指明而不是依赖 Swift 的默认访问控制等级。( internal )        如果你的代码库在将来不断扩张,它可能会被分解成子模块.这样做,会使一个已经装饰着访问控制信息的代码库更加方便、快捷。 17.限制性的访问控制        一般来来说,当添加访问控制到你的代码时,最好有详尽的限制。这里,使用 private 比 internal 更有意义,而使用 internal 显然比 public 更好。(注意: internal 是默认的)。        如有需要,把代码的访问控制变得更加开放是非常容易的(沿着这样的途径: "private" to "internal" to "public") 。过于开放的访问控制代码被其他代码使用可能不是很合适。有足够限制的代码能够发现不合适和错误的使用,并且能提供更好的接口。一个例子就是一个类型公开地暴露了一个internal cache。        而且,代码的限制访问限制了“暴露的表面积”,并且允许代码在更小影响其他代码的情况下重构。其他的技术如:Protocol Driven Development 也能起到同样的作用。 了解更多IOS开发入门知识欢迎访问中软国际教育集团技术知识库

更多>
iOS开发入门——17条 Swift 最佳实践规范(上)

iOS开发入门——17条 Swift 最佳实践规范(上)

2016-12-30

前言         这篇IOS开发入门文章是我根据在 SwiftGraphics 工作时的一系列笔记整理出来的。文中大多数建议是经过深思熟虑的,但仍可以有其他类似的解决方法。因此,如果其他方案是有意义的,这些方案会被添加上去。         这个最佳实践不是强加或者推荐 Swift 在程序、面向对象或者函数风格上的应用。更重要的是,这里要讲述的是务实的方法。如有需要的话,某些建议可能会集中在面向对象或者实用的解决方法。         这篇文章讲述的范围主要针对 Swift 语言以及 Swift 标准库。即便如此,如果能提出一个独特的 Swift 的视角和见解,我们依然会提供诸如 Swift 在 Mac OS、iOS、 WatchOS 以及 TV OS 上使用的特别建议。而如何在 Xcode 和 LLDB 上有效地使用 Swift,这样的建议也会以 Hints & tips 的风格提供。         这个过程需要付出很多的努力,非常感谢为本文做出贡献的那些人。         此外,可以在[Swift-Lang slack]里面讨论。 贡献者须知        请先确保所有的示例是可以运行的(某些示例可能不是正确)。这个 markdown 能够转换成一个 Mac OS X playground。 黄金准则 1. 一般来说,Apple 都是正确的,遵循 Apple 喜欢的或者示范的处理方式。在任何情况下,你都应该遵循 Apple 的代码风格,正如他们The Swift Programming Language 这本书里面的定义一样。然而 Apple 是个大公司,我们将会看到很多在示例代码中的差异。 2. 永远不要仅仅为了减少代码量而去写代码。尽量依赖Xcode中的自动补全代码,自动建议 , 复制和粘贴。详尽的代码描述风格对其他代码维护者来说是非常有好处的。即便如此,过度的冗余也会失去 Swift 的重要特性:类型推断。 最佳实践 1.命名        命名正如 Swift Programming Language 中的类型名称都是以大驼峰命名法命名的(例如:VehicleController)。        变量和常量则以小驼峰命名法命名(例如:vehicleName)。        你应该使用 Swift 模板去命名你的代码而不是使用 Objective-C 类前缀的风格(除非和 Objective-C 接连)。        不要使用任何匈牙利标识法( Hungarian notation )命名(例如:k为常量,m为方法),应使用简短的命名并且使用 Xcode 的类型 Quick Help (01.png+ click) 去查明变量的类型。同样地,不要使用小写字母+下划线( SNAKE_CASE )的命名方式。        唯一比较特别的是 enum 值的命名,这里需要使用大驼峰命名法(这个也是遵循 Apple 的 Swift Programming Language 风格): enum Planet {    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune}        在所有可能的情况里,名称的不必要减少和缩写都应该避免,将来你应该能在没有任何损害和依赖 Xcode 的自动补全功能的情况下,确切地指出类型特征" ViewController "。非常普遍的缩写如 URL 是允许的。缩写应该用所有字母大写( URL )或者所有字母小写( url )表示。对类型和变量使用相同的规则。如果 url 是个类型,则应该为大写,如果是个变量,则应该为小写。 2.注释        注释不应该用来使代码无效,注释代码会使代码无效且影响代码的整洁。如果你想要移除代码,但是仍想保留以防代码在以后会用到,你应该依赖 git 或者 bug tracker 。 3.类型推断 在可能的地方,使用Swift的类型推断以减少多余的类型信息。例如,正确的写法: var currentLocation = Location() 而不是: var currentLocation: Location = Location() 4.Self 推断 让编译器在所有允许的地方推断 self 。在 init 中设置参数以及 non-escaping closures 中应该显性地使用 self 。例如: struct Example {    let name: String     init(name: String) {        self.name = name    }} 5.参数列表类型推断        在一个闭包表达式( closure expression )中指定参数类型可能导致代码更加冗长。只有当需要指定类型时。 let people = [    ("Mary", 42),    ("Susan", 27),    ("Charlie", 18),] let strings = people.map() {    (name: String, age: Int) -> String in    return "(name) is (age) years old"}        如果编译器能够推断类型,则应该去掉类型定义。 let strings = people.map() {    (name, age) in    return "(name) is (age) years old"}        使用排序好的参数编号命名("$0","$1","$2")能更好地减少冗余,这经常能够完整匹配参数列表。只有当closure的参数名称中没有过多的信息时,使用编号命名。(例如特别简单的 maps 和 filters )。        Apple 能够并将会改变由 Objective-C frameworks 转换过来的 Swift 的参数类型。例如,选项被移除或者变为自动展开等。我们应有意地指定你的选项并依赖 Swift 去推断类型,减少在这种情况下程序中断的风险。        你总是应该有节制地指定返回类型。例如,这个参数列表明显过分冗余: dispatch_async(queue) {    () -> Void in    print("Fired.")} 6.常量 在类型定义的时候,常量应该在类型里声明为 static 。例如: struct PhysicsModel {    static var speedOfLightInAVacuum = 299_792_458}class Spaceship {  static let topSpeed = PhysicsModel.speedOfLightInAVacuum    var speed: Double     func fullSpeedAhead() {        speed = Spaceship.topSpeed    }}        使用 static 修饰常量可以允许他们在被引用的时候不需要实例化类型。        除了单例以外,应尽量避免生成全局常量。 7.计算型类型属性(Computed Properties) 当你只需要继承 getter 方法时,返回简单的 Computed 属性即可。例如,应该这样做: class Example {    var age: UInt32 {        return arc4random()    }} 而不是: class Example {    var age: UInt32 {        get {            return arc4random()        }    }} 如果你在属性中添加了 set 或者 didSet ,那么你应该显示地提供 get 方法。 class Person {    var age: Int {        get {            return Int(arc4random())        }        set {            print("That's not your age.")        }    }} 8.实例转换(Converting Instances) 当创建代码去从一个类型转换到另外的 init() 方法: extension NSColor {     convenience init(_ mood: Mood) {         super.init(color: NSColor.blueColor)     }}        在 Swift 标准库中,对于把一个类型的实例转换为另外一种,现在看来 init 方法是比较喜欢用的一种方式。 "to" 方法是另外一种比较合理的技术(尽管你应该遵循 Apple 的引导去使用 init 方法): struct Mood {    func toColor() -> NSColor {        return NSColor.blueColor()  }} 而你可能试图去使用一个getter,例如: struct Mood {    var color: NSColor {        return NSColor.blueColor()    }}         getters 通常由于应该返回可接受类型的组件而受到限制。例如,返回了 Circle 的实例是非常适合使用 getter 的,但是转换一个 Circle 为 CGPath 最好在 CGPath 上使用"to"函数或者 init() 扩展。 下篇:iOS开发——17条 Swift 最佳实践规范(下) 更多IOS开发入门知识请访问中软国际教育集团技术知识库!

更多>

推荐阅读

更多

中软卓越java培训地址:北京市海淀区科学院南路2号融科资讯中心C座北楼12层 联系电话:400-666-3775 邮箱账号:etc-marketing@chinasofti.com

©2008-2016 北京中软国际教育科技股份有限公司 京ICP备14058756号-2