在钢琴练习中,啥是高抬指?啥是贴键?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在钢琴练习中,啥是高抬指?啥是贴键?相关的知识,希望对你有一定的参考价值。

具体分析如下:

高抬指: 通常是配合慢弹来练习的,将弹奏力量送到指尖,把琴键迅速弹深弹透,第一关节着力要坚实牢固。除触键指尖紧张用力外,其余手指及手背均要松通。

贴键: 是高抬指弹奏法的继承和发展。贴键弹奏法强调肩、臂重量的运用。莱舍蒂茨基(Theodo Leschetizky)在教学中提出使用整个手臂,放松手指,不用敲击使手臂重量降落在键盘上的主张,追求演奏音色的丰满、柔润及华丽,他培养了一大批优秀的钢琴家。

钢琴弹奏中的各种因素存在着相互依赖、相互作用、相互制约的复杂关系。高抬指训练法与贴键弹奏法就是相互关联、互为补充的,它们是学琴不同阶段采用的不同训练方法。

扩展资料:

钢琴之所以能发出声音,主要是人的臂力与指力运动对键盘赋于作用力的结果。这对于每个键而言,所感应到的是垂直的“重力”。重力大,弦振动的幅度大,声响就强;重力小,弦振动的幅度小,声响就弱。

声响大小的对比,也是音乐表演中不可缺少的表现手段之一。演奏者在运用这类手段时,不付出一定劳动是难以实现的,而这种劳动的付出,又和部分肌肉“紧张”的活动是分不开的。钢琴从结构上来看与其它弦乐器的结构有它不同的特点,它不同于可以连续振动的弓弦乐器(例如二胡、提琴)。

当我们在钢琴上触键后,琴锤随即离开静止位置去撞击琴弦,并依靠弦的反作用力回到静态位置,此时即使手指不离键也不能保持声音的持续强度。在这种情况下,如果继续向琴键用力,就形成“多余劳动”。

音乐是声音的艺术,在钢琴艺术中,美妙悦耳的声音与手触键时使用力量的来源、力度的支配、触键的方法有着直接的关系。从生理学角度把人的上肢划分为手、前臂、大臂、肘部、腰部等几个可以独立活动的部分,正确运用力量是学习钢琴基本技能的关键,力的运用是否合理,是否科学决定所弹作品的成败。

参考资料:百度百科-触键

参考技术A 首先我先讲下,高抬指,跟所谓的贴建,都不是完整的技术。
只是一种触键的运动形式,的一部分。
属于是仅仅描述,手指部分运动形态的运动状态。
中国国内的钢琴教学,其实是出现过很多问题的。
首先,是历史因素,我们中国,不是钢琴的发源地,是外来接收钢琴教学。
具体的年限,大概是明期,有一定的钢琴教学传输。
由于宗教输入,最早获得的古,钢琴。

清朝时期,就有现代钢琴流入中国。

而目前我们现有的钢琴教学,是从1980年后,也就是特殊时期10年后,重新再次建立的。
在整个特殊时期,钢琴这种外国输入的乐器,可以说受到了因为政治因素影响的。。。封锁。

然后,我们国内目前的主流教法,所谓的基础功,高抬指,是在那种,一片沙漠的环境下产生的。
是的,是产生,而不是。。。由外界走了几百年,走通的路子,流入的。
你要想深刻了解钢琴练法里的高抬指,贴键,那么你必须知道我们目前的钢琴是怎么回事。
从,乐器的基础属性上,钢琴其实存在相当多不利于推广以及普及的属性。
乐器价格高,乐器不便携,乐器学习周期长,学习难度高,成功率极低,以及正常的钢琴教学老师,数量极其稀少。
然而,对于大量的盈利方面的需求来说,钢琴的高价格,成为了宣传推广的由头。
一种,本不适合推广的乐器,最终进行了全国普及。
这是高抬指,贴建等技术,可以获得普及的先决条件。
即,如果是纯粹的教学为原则,中国钢琴教学,是不可能允许高抬指这样的练法的。
我们目前的高抬指,贴键等说法(而非你认知中的练法)其实是在经济利益驱动,尽量扩大钢琴教学市场,降低教师群体,教学质量,教学周期,教学难度的基础上产生!
是产生,而非流入。
然后,我们讲下高抬指到底是什么吧。。。
由于钢琴演奏,最终都要经过手指,所以手指在某些情况下需要抬落动作,完成触键(请注意,不是所有情况下需要),然而,单纯贴着键盘,单纯依赖手指的运动能力,是无法在贴建的距离,完成有效触键的。

主要是声音效果不够。
由于5个手指不够均匀,可以试验下单纯使用4指跟5指进行贴建,手指发力,完成触键,处理强音,你会发现,很难处理好,运动困难。
而如果把手指的抬落动作进行放大,甚至夸张化,再使用高抬的状态,崩着力量下去,则可以由于更高的运动空间,获得更好的触键速度的改变。
钢琴的声音大小,直接由琴键起落速度,改变内在的击锤敲击速度,而产生强音。
所谓的把力量传递到指尖,把琴键迅速弹透,其实就是一个。
把手指的空间拉开,然后借助这个拉开的空间,进行加速罢了。
尤其要注意一点,如果是不仅仅有手指的力量,而是后方的发力点,也锻炼到学习到,高抬,毫无必要,贴键的状态下,完全可以保证速度,还能具备最强的强音。
以上说法,可以在各个视频平台,看到各种钢琴家的实例演奏而获得验证。
沈文裕演奏李斯特《钟》_哔哩哔哩_bilibili https://www.bilibili.com/video/BV194411G731/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=76471667cdccaa05ae6d864d1108042e
比如以上,有很好的看到手部动作。
这种手部动作基本就是贴键了。

当然了,发力不在手指,甚至可以看到手指完全没有动作,使用指侧完成高效触键的示范!
你看,对比另外一个回答,使用手指指侧,照样可以演奏出优秀的音色。
我相信你已经看出来一个问题了,拉开手指距离,使用空间加速,产生仅仅局限于手指指力发力下的琴键起落速度优势。
这种东西,毫无教学内容可言。
也就是说,其实1980年代开始,很多钢琴老师教的东西,等于是没有内容。
在技术人员储备,一片沙漠的情况下,进行所谓的全国普及,就是这个结果。
绝大多数,甚至是基本就是全部的钢琴老师,其实都是没办法提供多先进的技术的。
是直接拿出一个说法,进行全国普及,而不是先用10年,20年,进行验证!
那么10年20年,一轮下来后的结果怎样?
大失败。
无法达成。
由于实际上缺乏教学内容,这种额外拉伸手指,获得额外空间加速的技术,在实际的跑动速度上,具备绝对劣势。
我举个数据讲下。
首先是国内普遍的所谓考级10级。
音阶部分,1分钟126拍,每拍4音,1分钟480音左右。
国内大部分通过考级10级的人,目前来说,是很难做好的。
但,这个范畴,基本是在高抬指这一套教学体系的能力之内。
然而,考级10级,不是真正的有多高的标准的。
再举个例子,国际公认的专业入门。
车尔尼 钢琴快速练习曲 Czerny 299 第23首 及练习提示 钢琴谱 简谱 http://www.jianpuw.com/htm/kx/545618.htm
车尔尼299是国际公认的专业入门程度。
其中的第23首,左上角速度标记,1分钟84,单位是附点二分音符,也就是一小节时值。
也就是1分钟84拍,每拍12音,1分钟1008音跑动速度。第一行P,第二行音阶模型。
我们使用同样的音阶模型做出对比。
这样公平。
同样是音阶对比,考级10级,1分钟480音,专业入门,车尔尼,1分钟1008.
一半不到。
而曲谱谱例上能够寻觅到的最快速的音阶,是1分钟1400音。。。
钢琴演奏的音阶,钢琴家演奏的。
则是。。我放案例吧。
钢琴家 海席克 独奏《贝多芬悲怆奏鸣曲 第三乐章》 Eric Heidsieck_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1NW411W7vh/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=76471667cdccaa05ae6d864d1108042e
第二面部分,半秒两小节,单旋律20多音,1秒40的速度,P,音阶与半音音阶结合。

也就是,1分钟2400音的超高速。
也就是说,高抬指出现的问题,就是很简单的一个,做不到。
它不是解决问题的手段,练它,你所能够跑动到的速度,是极低的。
而当时,1980年后的20年,由于缺乏大量的教学成果。
所以。。。钢琴老师的说法,是学生练的不够导致的。
这种教法的观念,是认为只有这样的手指运动能力以及形式,才能够满足相应的音量大小。;
也就是,最基础的,把钢琴的声音,弹出来罢了。
剩下的一切,统统没有。
我们现在是2023年,基本来说,高抬指的教学极限,已经出来了。
大部分人,练这个,只能到1分钟500音左右(其他效果也能处理),人体极限,1分钟600音(某钢琴家)。
考级10级?
确实可以满足,但是大部分中高端曲目,甚至中等程度流行曲,其实无法演奏,无法解决的。
最主要的问题,就处在跑动速度上。
由于单纯依赖手指,并且需要手指额外的抬落运动。
去扩展空间加速。
所以,就有老师想要解决,提出了贴键,这个概念。
认为,如果能够把手指额外抬升的空间,减小,那么是否可以提升速度呢?
是的,确实提升了一定程度(仅仅是一定程度)。
从1分钟600音的生理极限,提高到了1分钟800音。

仅此而已。
而这一技术的进步,被经济盈利方面的团体,视为洪水猛兽般的挑战。。。
因为,单单是手指贴键,这一概念的突破,其实是钢琴教师群体,已经发现教学的内容,无法使学生解决问题,也就是正面的提出了速度要求!
什么意思呢?
我举个例子,两个老师教,一个教高抬指,一个教贴建,前者只能到1分钟500音左右,而后者可以到1分钟800音左右。
差距出现了,后者就可以说,前者使不会教的老师。
没有提供正确的技术。
然而,就有心的,或者干脆不是在这个行业里捞钱的朋友可以看到。
1分钟800,依然无法解决问题。
还是大部分教学内容,归零。
再在之后,就是关于另外的,除开高抬指,贴键,新式的教法出现了。
另一个回答里的,说贴键,使高抬指弹奏方法的继承和发展,属于是完全错误。
这是由于我们国内教学成果大失败,首先极少部分,真的在做钢琴教学,教学这方面的人才,发现了问题,寻觅结果后的产物!
其次,重量弹奏法,淘宝满等国外的技术,其实是早在上个世纪,也就是我们国内搞高抬指之前,就在国际社会,大量存在。
我们国内的教学情况,根据时间来区分,基本可以分为高抬指阶段,高抬指被质疑推出的贴键技术阶段,贴键技术依然无法满足教学目标,而出现的继续向外寻觅(主要的成果其实都在外国引入,国内研究有成果,但是其实就是跟国外早已有的技术相重合,等于额外100年后,我们再走一遍罢了)获得的新式技术,直接破开高抬,与贴键的技术概念,所走出的,非手指发力发力点的技术。
然后,新的技术讲下。
首先是发力点,我们的发力点,包含了手指指节,掌指关节,手腕,前臂肌肉群,大臂肌肉群。
每一个发力点,都可以构成单独的触键运动。
每一个发力点,由于其特定的生理结构,以及耐受力上限,以及运动形式的区分。
所以其运动的跑动速度上限,是不同的。
而非手指发力的发力点,可以使用手型定时的概念,完成一动多音。
三大臂力发力技术的基础,落提技术的展示详解~早日打倒高抬指!_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1YL4y157yX/?spm_id_from=333.999.0.0
比如,我视频里,是使用的落提,依赖提早完成的手型定式,达成一个动作5个音,在0.1秒内完成触键!
贴键,达成最强音。
因为之前讲过了,非手指发力,可以使琴键,在贴键状态下,达到最高的琴键起落速度。
高速跑动,其实在国际社会,传到国内的知识来说,是已经公开的。
由固定的手型定式(手型确实要练,但如果脱离了明确的技术,以及触键前提,那就是狗屎),后方的发力点,带动手指触键(触键的过程里,手指被带动,所以才能保证手型定式),完成1个动作2音,到5音(根据音型模型而来)。
后方发力点,单次的运动动作,是0.1秒,到0.06秒(以上方老头子,那个钢琴家举例)。
而一次动作,可以完成2音到5音。
也就是说,0.1秒2音,0.1秒5音,1秒20,1秒50,1分钟1200音,到1分钟3000音的超高演奏。
老头子的单次运动动作,是0.06秒一个动作,所以,他虽然使用的一个动作3个音,但是其实速度不只是。。。。1分钟1800,而是到了1分钟2400.
这样的一种新式教法,以及新式教法教学成功的案例。
沈文裕演奏李斯特《钟》_哔哩哔哩_bilibili https://www.bilibili.com/video/BV194411G731/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click
在我们国内已经大量出现。
不只是某个钢琴家。
我们还出现了,很多新锐教法下,短周期(5年左右),低龄儿童(10岁),就达到高程度演奏的实例。
李斯特-钟 超高难度 10岁琴童零瑕疵完成_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1bG4y1G7f5/?spm_id_from=333.337.search-card.all.click
当然了,由于学习年限,以及年龄限制,很显然对比钢琴家还有一定差距。

然而,对比1980年代,1990年代,2000年代,那批使用高抬指,所谓贴键教法出来的音乐学院钢琴系学生来说。
干脆就是,这样的小孩子,演奏的效果,已经超过了那些人的极限的程度(绝大多数被超越了)。
也就是,学习10年,20年,甚至不如学习5年的效果。
这就是新式教法,在科学以及长时间验证下(国外几百年搞钢琴对比中国40年)的教学成果对比!
然后重点讲下高抬指跟贴键。
要想达到高程度的演奏,首先,高抬指这种练法,强调的就是人体机能。
它们认为,你的演奏不达标,是你的训练强度不够,由额外拉伸的距离,来训练手指,可以训练出超人。
然而,结果验证了,这只是个教学没有内容,老师不负责任的借口罢了。。。
什么叫做不负责任?
以车尔尼299为例,第23首,需要1分钟1008音的跑动速度的技术。
钢琴老师,不直接提供可以达到的技术,就是不负责任。
提供了,但是学生没有练到,那才是学生的问题!
然而,由于教学产业的卑劣,准确的讲,教学产业里没有教学的,只有经济盈利。
所以,整个教师群体,永远不愿意正面应对这一问题(包括现在)。
半数以上学习钢琴者,依然是在走高抬指那一套。
而据一位武汉的医生的调查。
他是专门做骨科的。
因为高抬指,以及包括贴键,这样的单一训练手指运动机能(他所调查的学生里,没有一个学生可以讲出来除开手指以外的发力点的。)是整个群体,专业群体百分30的人,严重到需要看医生的地步。

为什么呢?
每一个发力点,耐受力以及运动形式固定。
能够处理的跑动速度,数值是多少就是多少。
机能训练,提升不了多少的。
然而,曲目的要求,远高于可以达成的极限!
学生,长期在相应的极限限度下,进行训练。
自然的,生理机能就被损耗掉。
自然的,就具备极高的演奏事故概率!
自然的,3成,练废。
非专业里,以是否上音乐学院,有工作等强制性需求为区分。
则很少看到伤病(但依然存在)。
原因,是没有因为学习,考试,比赛,工作等方面,强制性的练习需求!
根据运动形式以及耐受力,具体的发力技术的差距很大,尤其是臂力技术(说法上这样说,但其实依然有手指,并且其教学内容跟高抬指与贴键那套不一样!)由于不占用手指,不破坏手型定式,可以达成2倍到7倍的跑速提升(并且由于不占用手指,可以获得其他的音乐效果)。
也就是说,高抬指,1分钟600音,贴键,1分钟800音,新式教法技术,1分钟1200音到1分钟3000音。
这就是我们大略能够看到的健康安全的运动极限!
任何技术的百分80的数据,都是不安全的,都存在一定的。风险性。
比如天气,比如劳累,都会影响(你不可能用百分百的状态去演奏!那样风险太高)。
所以,健康练习方面,高抬指跟贴键,还有这方面的问题。
再一个单独讲下手指,手指需要训练,手指的抬起落下,手指的伸直弯曲,手指的刚柔转换,3类六种技术。
所有技术,训练完毕,专业强度下,也就是几周时间罢了。。。。
绝不是,高抬指,贴键那批人讲的需要几年时间,十几年,几十年才可以练出来!

参考:啥是变量范围,哪些变量可以从哪里访问,啥是“未定义变量”错误?

【中文标题】参考:啥是变量范围,哪些变量可以从哪里访问,啥是“未定义变量”错误?【英文标题】:Reference: What is variable scope, which variables are accessible from where and what are "undefined variable" errors?参考:什么是变量范围,哪些变量可以从哪里访问,什么是“未定义变量”错误? 【发布时间】:2013-06-02 07:30:45 【问题描述】:

注意:这是一个在 PHP 中处理变量范围的参考问题。请关闭符合此模式的许多问题中的任何一个作为此问题的副本。

什么是 PHP 中的“变量范围”?一个 .php 文件中的变量可以在另一个文件中访问吗?为什么我有时会收到“未定义的变量” 错误?

【问题讨论】:

【参考方案1】:

我不会发布这个问题的完整答案,因为现有的答案和PHP manual 很好地解释了其中的大部分内容。

但是漏掉了一个主题是superglobals,包括常用的$_POST$_GET$_SESSION等。这些变量是数组,在任何范围内都是可用的,没有@ 987654328@声明。

例如,此函数将打印出运行 PHP 脚本的用户名。该变量可用于函数没有任何问题。

<?php
function test() 
    echo $_ENV["user"];

“全局变量不好”的一般规则通常在 PHP 中修改为“全局变量不好但超全局变量没问题”,只要不滥用它们即可。 (所有这些变量都是可写的,所以如果你真的很糟糕,它们可以用来避免依赖注入。)

不保证这些变量存在;管理员可以使用php.ini 中的variables_order directive 禁用部分或全部,但这不是常见的行为。


当前超全局变量列表:

$GLOBALS - 当前脚本中的所有全局变量 $_SERVER - 服务器和执行环境的信息 $_GET - 在 URL 的查询字符串中传递的值,与用于请求的 HTTP 方法无关 $_POST - 使用 application/x-www-form-urlencodedmultipart/form-data MIME 类型在 HTTP POST 请求中传递的值 $_FILES - 以multipart/form-data MIME 类型在 HTTP POST 请求中传递的文件 $_COOKIE - 当前请求传递的 Cookies $_SESSION - PHP 内部存储的会话变量 $_REQUEST - 通常是 $_GET$_POST 的组合,但有时是 $_COOKIES。内容由php.ini中的request_order directive决定。 $_ENV - 当前脚本的环境变量

【讨论】:

【参考方案2】:

什么是“可变范围”?

变量的“范围”或“可访问它们的位置”是有限的。仅仅因为您在应用程序中somewhere 写过一次$foo = 'bar'; 并不意味着您可以在应用程序内的其他地方everywhere 引用$foo。变量$foo 具有一定的范围,在该范围内它是有效的,只有同一范围内的代码才能访问该变量。

PHP 中的作用域是如何定义的?

很简单:PHP 有函数范围。这是 PHP 中唯一存在的范围分隔符。函数内的变量仅在该函数内可用。函数外的变量可以在函数外的任何地方使用,但不能在任何函数内使用。这意味着 PHP 中有一个特殊的范围:global 范围。在任何函数之外声明的任何变量都在这个全局范围内。

示例:

<?php

$foo = 'bar';

function myFunc() 
    $baz = 42;

$fooglobal 范围内,$bazmyFunc 内的 local 范围内。只有myFunc 中的代码才能访问$baz。只有代码外部 myFunc 可以访问$foo。双方都无法访问对方:

<?php

$foo = 'bar';

function myFunc() 
    $baz = 42;

    echo $foo;  // doesn't work
    echo $baz;  // works


echo $foo;  // works
echo $baz;  // doesn't work

范围和包含的文件

文件边界不分开范围:

a.php

<?php

$foo = 'bar';

b.php

<?php

include 'a.php';

echo $foo;  // works!

适用于included 代码的规则与适用于任何其他代码的规则相同:只有functions 单独的范围。出于范围的目的,您可能会考虑包含复制和粘贴代码之类的文件:

c.php

<?php

function myFunc() 
    include 'a.php';

    echo $foo;  // works


myFunc();

echo $foo;  // doesn't work!

在上面的例子中,a.php 包含在 myFunc 中,a.php 中的任何变量都只有局部函数范围。仅仅因为它们看起来a.php 的全局范围内并不一定意味着它们是,它实际上取决于包含/执行代码的上下文。

函数和类中的函数呢?

每一个新的function 声明都会引入一个新的作用域,就这么简单。

(匿名)函数内的函数

function foo() 
    $foo = 'bar';

    $bar = function () 
        // no access to $foo
        $baz = 'baz';
    ;

    // no access to $baz

$foo = 'foo';

class Bar 

    public function baz() 
        // no access to $foo
        $baz = 'baz';
    



// no access to $baz

范围有什么用?

处理范围问题可能看起来很烦人,但是有限的变量范围对于编写复杂的应用程序至关重要!如果您声明的每个变量都可以从您的应用程序中的其他任何地方获得,那么您将无所适从在你的变量上,没有真正的方法来跟踪什么改变了什么。您可以为变量命名的合理名称只有这么多,您可能希望在不止一个地方使用变量“$name”。如果您的应用程序中只能有这个唯一的变量名一次,您将不得不采用非常复杂的命名方案来确保您的变量是唯一的,并且您不会从错误的代码中更改错误的变量。

观察:

function foo() 
    echo $bar;

如果没有作用域,上面的函数会做什么? $bar 来自哪里?它有什么状态?它甚至初始化了吗?每次都要检查吗?这是不可维护的。这让我们...

跨越范围界限

正确方法:传入传出变量

function foo($bar) 
    echo $bar;
    return 42;

变量$bar 明确地作为函数参数进入这个范围。只要看看这个函数,就很清楚它使用的值来自哪里。然后它显式地返回一个值。调用者有信心知道函数将使用哪些变量以及它的返回值来自哪里:

$baz   = 'baz';
$blarg = foo($baz);

将变量的作用域扩展到匿名函数

$foo = 'bar';

$baz = function () use ($foo) 
    echo $foo;
;

$baz();

匿名函数在其周围范围内显式包含$foo。请注意,这与 global 范围不同。

错误的方式:global

如前所述,全局作用域有些特殊,函数可以显式地从中导入变量:

$foo = 'bar';

function baz() 
    global $foo;
    echo $foo;
    $foo = 'baz';

该函数使用和修改全局变量$foo不要这样做! (除非你真的真的真的很清楚自己在做什么,即使那样:不要这样做!)

这个函数的调用者看到的都是这样的:

baz(); // outputs "bar"
unset($foo);
baz(); // no output, WTF?!
baz(); // outputs "baz", WTF?!?!!

没有迹象表明这个函数有任何副作用,但确实有。这很容易变成一团乱麻,因为一些函数不断修改并要求一些全局状态。您希望函数是无状态的,只作用于它们的输入并返回定义的输出,不管你调用它们多少次。

您应该尽可能避免以任何方式使用全局范围;当然,您不应该将变量从全局范围“拉”到本地范围中。

【讨论】:

你刚才说global的错误方式,所以请告诉我们什么时候应该使用global?请解释一下(有点)什么是static ..? @stack global 没有“正确”的方式。总是错的。传递函数参数是正确的。 static 在手册中有很好的解释,与范围没有太大关系。简而言之,它可以被认为是一个“作用域全局变量”。我在这里 kunststube.net/static 扩展了它的用法。 我的简单想法是,如果一个 php 变量足够重要,值得拥有全局状态,那么它应该在数据库中有一列。也许这是一种矫枉过正,但它是一种适合我平庸的编程智慧的万无一失的方法 @Arthur 那里有很多东西要解压……ಠ_ಠ 这绝对不是我认可的方法。 @Teemu 不,因为这是通过可配置名称显式传递。不过,它可能导致奇怪的副作用,并且仅在特定情况下才有意义,例如 preg_match,在这种情况下,您有一个“主要”和“次要”返回值。【参考方案3】:

虽然在函数范围内定义的变量不能从外部访问,但这并不意味着在该函数完成后您不能使用它们的值。 PHP 有一个众所周知的 static 关键字,它在面向对象的 PHP 中广泛用于定义静态方法和属性,但请记住,static 也可以在函数内部用于定义静态变量。

什么是“静态变量”?

静态变量不同于函数作用域中定义的普通变量,因为它在程序执行离开这个作用域时不会丢失值。让我们考虑以下使用静态变量的示例:

function countSheep($num) 
 static $counter = 0;
 $counter += $num;
 echo "$counter sheep jumped over fence";


countSheep(1);
countSheep(2);
countSheep(3);

结果:

1 sheep jumped over fence
3 sheep jumped over fence
6 sheep jumped over fence

如果我们在没有static 的情况下定义$counter,那么每次回显的值将与传递给函数的$num 参数相同。使用static 可以构建这个简单的计数器,而无需额外的解决方法。

静态变量用例

    在随后的函数调用之间存储值。 在没有办法(或没有 目的)将它们作为参数传递。 缓存通常最好检索一次的值。为了 例如,读取服务器上不可变文件的结果。

技巧

静态变量只存在于局部函数范围内。它不可能是 在定义它的函数之外访问。所以你可以 确保它将保持其值不变,直到下一次调用 那个函数。

静态变量只能定义为标量或标量 表达式(自 PHP 5.6 起)。不可避免地为其分配其他值 至少在撰写本文时会导致失败。 不过,您可以在代码的下一行执行此操作:

function countSheep($num) 
  static $counter = 0;
  $counter += sqrt($num);//imagine we need to take root of our sheep each time
  echo "$counter sheep jumped over fence";

结果:

2 sheep jumped over fence
5 sheep jumped over fence
9 sheep jumped over fence

静态函数在对象的方法之间有点“共享” 同班。看下面的例子就很容易理解了:

class SomeClass 
  public function foo() 
    static $x = 0;
    echo ++$x;
  


$object1 = new SomeClass;
$object2 = new SomeClass;

$object1->foo(); // 1
$object2->foo(); // 2 oops, $object2 uses the same static $x as $object1
$object1->foo(); // 3 now $object1 increments $x
$object2->foo(); // 4 and now his twin brother

这仅适用于同一类的对象。如果对象来自不同的类(甚至相互扩展),静态变量的行为将符合预期。

静态变量是在函数调用之间保持值的唯一方法吗?

在函数调用之间保持值的另一种方法是使用闭包。闭包是在 PHP 5.3 中引入的。简而言之,它们允许您将对函数范围内的某些变量集的访问限制为另一个匿名函数,这将是访问它们的唯一方法。处于闭包中的变量可能会(或多或少成功地)模仿结构化编程中的“类常量”(如果它们在闭包中通过值传递)或“私有属性”(如果通过引用传递)等 OOP 概念。

后者实际上允许使用闭包而不是静态变量。使用什么始终由开发人员决定,但应该提到的是,静态变量在使用递归时绝对有用,值得开发人员注意。

【讨论】:

以上是关于在钢琴练习中,啥是高抬指?啥是贴键?的主要内容,如果未能解决你的问题,请参考以下文章

钢琴八级厉害吗?

ADT 名称。在 Haskell 中,啥是“Left a”,那么啥是“a”?

《全国钢琴演奏考级作品集(新编第一版) 》1-10级曲目

assertEquals,啥是实际的,啥是预期的?

hbase中啥是Region,啥是RegionServer

数据结构问题 在邻接表中啥是表节点?啥是表头节点?啥是头节点?