【PHP面向对象进阶必读】:PHP 7.1类常量可见性详解与安全编码实践

第一章:PHP 7.1类常量可见性概述

从 PHP 7.1 版本开始,类常量支持定义访问可见性,这是面向对象编程中一项重要的增强功能。在此之前,类中的常量默认为公共(public)且无法限制其访问范围。引入可见性控制后,开发者可以使用 public、protected 和 private 关键字来明确常量的访问权限,从而更好地封装类的内部数据。

可见性关键字说明

  • public:可在任何地方访问,包括类外部、子类和实例。
  • protected:仅可在类本身及其子类中访问。
  • private:仅限类内部访问,子类也无法直接访问。

语法示例

class MathUtils
{
    public const PI = 3.14159;
    protected const MAX_VALUE = 1000;
    private const SECRET_KEY = 'abc123';

    public function getSecret()
    {
        // 私有常量可在类内部正常使用
        return self::SECRET_KEY;
    }
}

class AdvancedMath extends MathUtils
{
    public function getMax()
    {
        // 可以访问父类的 protected 常量
        return self::MAX_VALUE;
    }
}
上述代码展示了三种可见性级别的使用方式。在子类 AdvancedMath 中,可以通过 self:: 访问继承的 protected 常量,但无法访问 private 的 SECRET_KEY。

可见性对比表

可见性类内部子类类外部
public✓✓✓
protected✓✓✗
private✓✗✗
这一特性提升了类设计的安全性和封装性,尤其适用于构建大型应用或框架时对核心常量进行保护。

第二章:类常量可见性的语法与机制解析

2.1 PHP 7.1之前类常量的访问控制局限

在PHP 7.1之前,类常量默认是全局可访问的,无法通过public、private或protected关键字来限制其可见性。这意味着一旦定义,常量在整个脚本执行环境中都可被直接访问。
访问控制缺失示例
class MathUtils {
    const PI = 3.14159;
}

echo MathUtils::PI; // 合法且无法阻止
上述代码中,PI常量对外完全暴露,即使希望仅在类内部使用也无法实现封装。
主要问题归纳
  • 缺乏封装性,违背面向对象设计原则;
  • 子类可能意外依赖父类内部常量;
  • 无法隐藏实现细节,增加耦合风险。
这一局限促使PHP社区呼吁增强类常量的访问控制能力,最终在PHP 7.1中引入了对public、private和protected的支持。

2.2 public、protected、private可见性关键字详解

在面向对象编程中,`public`、`protected` 和 `private` 是控制类成员访问权限的核心关键字。它们决定了属性和方法在类内部、子类以及外部代码中的可见性。
访问级别对比
  • public:成员可在任何地方被访问,无限制。
  • protected:仅允许类自身及其子类访问。
  • private:仅限类内部访问,子类也不可访问。
代码示例与分析

class User {
    public $name;
    protected $age;
    private $password;

    public function setPassword($pwd) {
        $this->password = password_hash($pwd, PASSWORD_DEFAULT);
    }
}
上述代码中,$name 可在类外直接读写;$age 只能在 User 或其子类中使用;$password 完全私有,只能通过公共方法如 setPassword() 间接设置,确保数据安全性。
可见性规则表
访问修饰符本类子类外部
public✓✓✓
protected✓✓✗
private✓✗✗

2.3 类常量可见性在继承体系中的行为分析

类常量的可见性决定了其在继承结构中的访问能力。PHP 支持 `public`、`protected` 和 `private` 三种访问修饰符,直接影响子类对父类常量的继承与调用。
可见性修饰符的行为差异
  • public:可在任意作用域被访问,子类和外部代码均可读取;
  • protected:仅限类自身及子类内部访问,外部不可调用;
  • private:仅限定义该常量的类内部使用,子类也无法访问。
abstract class DatabaseConfig {
    public const TYPE = 'MySQL';
    protected const PORT = 3306;
    private const SECRET = 'xyz';
}

class MySqlConnection extends DatabaseConfig {
    public function showPort(): void {
        echo self::PORT;  // 合法:protected 可被子类访问
    }
    // echo self::SECRET; // 错误:private 常量不可继承
}
上述代码中,MySqlConnection 可访问 TYPE 和 PORT,但无法继承 SECRET,体现了私有常量的封装边界。

2.4 静态上下文与常量访问的安全边界

在多线程编程中,静态上下文中的常量看似安全,实则可能因初始化时机引发竞态条件。尽管常量本身不可变,但其访问路径若涉及延迟初始化,则需谨慎设计。
线程安全的常量初始化模式

var configOnce sync.Once
var globalConfig *Config

func GetConfig() *Config {
    configOnce.Do(func() {
        globalConfig = loadDefaultConfig()
    })
    return globalConfig
}
上述代码利用 sync.Once 确保初始化仅执行一次。即使多个 goroutine 并发调用 GetConfig,loadDefaultConfig() 也不会重复执行,从而保障了静态上下文的初始化安全性。
常见风险与防护策略
  • 避免在 init 函数中依赖外部可变状态
  • 使用只读接口暴露内部常量结构
  • 对复合型常量(如 map、slice)进行深拷贝封装

2.5 可见性修饰符对类常量的作用范围实践验证

在面向对象编程中,可见性修饰符(如 public、protected、private)不仅影响属性和方法,也作用于类常量。通过合理设置修饰符,可控制常量在继承链和外部访问中的可见程度。
常见可见性修饰符行为对比
  • public:可在类内部、子类及外部访问;
  • protected:仅限类自身及子类访问;
  • private:仅限定义该常量的类内部使用。
代码示例与验证
class ParentClass {
    public const PUBLIC_CONST = 'public';
    protected const PROTECTED_CONST = 'protected';
    private const PRIVATE_CONST = 'private';
}

class ChildClass extends ParentClass {
    public function showConstants() {
        echo self::PUBLIC_CONST;        // 输出: public
        echo self::PROTECTED_CONST;     // 输出: protected
        // echo self::PRIVATE_CONST;    // 错误:无法访问 private 常量
    }
}
上述代码中,PUBLIC_CONST 和 PROTECTED_CONST 可被子类正常调用,而 PRIVATE_CONST 因作用域限制无法访问,体现了封装性的设计原则。

第三章:常见使用场景与编码模式

3.1 定义公共配置常量的最佳实践

在大型项目中,统一管理配置常量能显著提升可维护性与环境适配能力。应将所有公共配置集中定义于独立文件中,避免散落在业务逻辑中。
集中式常量管理
使用单独的配置文件存放常量,便于统一查阅和修改:
package config

const (
    ServerPort = 8080
    MaxUploadSize = 10 << 20 // 10MB
    DBDriver = "mysql"
    RedisAddr = "localhost:6379"
)
上述代码将服务端口、上传限制、数据库驱动等关键参数定义为包级常量,编译时即确定值,提升性能并减少运行时错误。
环境隔离策略
  • 通过构建标签(build tags)区分开发、测试、生产环境
  • 利用 init() 函数按环境加载对应常量
  • 禁止在常量中硬编码敏感信息(如密码),应结合安全配置中心

3.2 保护内部状态常量防止外部篡改

在构建高可靠性的系统组件时,内部状态常量的安全性至关重要。一旦被外部非法修改,可能导致状态不一致或逻辑错乱。
使用只读封装机制
通过语言特性限制常量访问权限,例如在 Go 中利用包级私有变量和公开的读取接口:

package config

var apiTimeout = 30 // 私有常量,防止直接修改

func GetApiTimeout() int {
    return apiTimeout
}
该模式确保外部只能通过 GetApiTimeout() 获取值,无法直接赋值修改,实现“只读暴露”。
运行时保护策略
  • 使用不可变数据结构,如 sync.Map 配合原子操作
  • 在初始化阶段锁定关键变量,后续禁止变更
  • 引入校验机制,定期比对常量哈希值以防被劫持

3.3 私有常量封装实现细节提升代码内聚性

在Go语言开发中,合理使用私有常量能有效隐藏实现细节,增强模块的内聚性。通过将特定逻辑依赖的值定义为私有常量(以小写字母开头),可防止外部包直接引用,降低耦合。
封装网络重试策略参数
const (
  maxRetries = 3
  retryDelay = 500 // 毫秒
)
上述常量定义了请求重试的最大次数和延迟时间。由于这些值仅服务于当前包内部逻辑,设为私有避免了外部误用,同时便于统一调整策略。
优势分析
  • 提升可维护性:集中管理 magic number
  • 增强封装性:外部无法感知内部阈值设定
  • 促进一致性:多处使用时保证值统一

第四章:安全编码与设计原则

4.1 防止信息泄露:合理设置常量可见性级别

在Go语言中,常量的可见性由其标识符的首字母大小写决定。首字母大写的常量对外部包公开,小写的则仅在包内可见。不当的可见性设置可能导致敏感配置信息意外暴露。
可见性控制示例
// config.go
package config

const APIKey = "secret123"        // 外部可访问,存在泄露风险
const apiSecret = "private456"     // 仅包内可用,更安全
上述代码中,APIKey 能被其他包直接引用,若包含敏感值则易造成信息泄露;而 apiSecret 因首字母小写,有效限制了访问范围。
最佳实践建议
  • 敏感常量应使用小写字母命名,限制作用域
  • 通过getter函数按需提供只读访问
  • 避免在公共API中暴露配置细节

4.2 避免继承破坏:受保护常量的设计考量

在面向对象设计中,受保护常量(protected const)的使用需谨慎,以防止子类无意修改父类行为导致继承链破坏。
设计原则
  • 常量应明确表达不可变语义
  • 避免将可变数据通过 protected 暴露给子类
  • 优先使用私有常量 + 公共访问器模式
代码示例

abstract class DatabaseConfig {
    protected const TIMEOUT = 30;
    
    public function getConnectionTimeout(): int {
        return static::TIMEOUT; // 延迟绑定确保子类可覆盖
    }
}
上述代码通过 static:: 实现静态 late binding,允许子类安全重写常量值而不影响父类逻辑。同时封装访问逻辑,降低耦合。
继承风险对比
策略安全性灵活性
public const低高
protected const中高
private const + getter高中

4.3 常量可见性与自动加载、反射API的交互影响

在PHP中,常量的可见性虽不受访问修饰符限制,但其定义上下文会影响自动加载机制的触发时机。当使用反射API读取类常量时,若类尚未加载,PHP将尝试通过自动加载器(如spl_autoload_register)加载对应类文件。
反射获取常量示例

// 定义可被自动加载的类
class MathConstants {
    const PI = 3.14159;
}

// 使用反射读取常量
$reflection = new ReflectionClass('MathConstants');
echo $reflection->getConstant('PI'); // 输出: 3.14159
上述代码执行时,若MathConstants未包含在当前作用域,自动加载机制将尝试定位并包含该类文件。反射API调用getConstant()前会隐式触发类加载。
自动加载与命名空间的影响
  • 常量所属类必须能被自动加载器正确解析路径
  • 命名空间需与目录结构匹配,否则加载失败
  • 反射操作不会加载未引用的类,延迟触发加载时机

4.4 在领域模型中应用安全常量的设计案例

在领域驱动设计中,安全常量的引入能有效防止硬编码带来的维护风险。通过将权限级别、操作类型等固定值抽象为不可变常量,可提升模型的清晰度与安全性。
安全常量的定义与封装
以用户权限管理为例,使用枚举类封装角色类型:
type Role string

const (
    RoleAdmin  Role = "admin"
    RoleUser   Role = "user"
    RoleGuest  Role = "guest"
)
该设计确保所有角色值集中管理,避免字符串误写。Role 类型作为领域模型的一部分,参与方法签名和业务校验,增强类型安全性。
常量在业务逻辑中的应用
在服务层判断权限时,直接引用常量进行比较:
func CanEdit(role Role) bool {
    return role == RoleAdmin
}
此方式消除魔法值,提升代码可读性,同时便于后续扩展(如引入策略模式)。结合接口约束,可实现更复杂的权限判定规则。

第五章:总结与未来演进方向

云原生架构的持续深化
现代企业正加速向云原生转型,Kubernetes 已成为容器编排的事实标准。例如,某金融企业在其核心交易系统中引入服务网格 Istio,通过流量镜像与熔断机制将生产故障排查时间缩短 60%。
边缘计算与 AI 推理融合
随着 IoT 设备激增,AI 模型正从中心云向边缘下沉。以下代码展示了在边缘节点使用轻量级模型进行实时推理的典型实现:

import onnxruntime as ort
import numpy as np

# 加载优化后的 ONNX 模型
session = ort.InferenceSession("model.onnx")

# 模拟传感器输入数据
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)

# 执行边缘推理
result = session.run(None, {"input": input_data})
print("Inference result:", result[0].argmax())
可观测性体系升级路径
下一代可观测性平台需整合日志、指标与追踪三大支柱。以下是某电商大促期间监控组件部署对比:
组件传统方案演进方案
日志收集Filebeat + ELKOpenTelemetry Collector + Loki
链路追踪ZipkinJaeger + W3C Trace Context
指标存储Prometheus 单实例Thanos + 多副本持久化
安全左移实践扩展
DevSecOps 正在融入 CI/CD 流水线。某互联网公司实施静态代码分析与 SBOM(软件物料清单)自动生成,结合 SAST 工具在 Git 提交时阻断高危漏洞。流程如下:
  • 开发者推送代码至仓库
  • CI 触发 Trivy 扫描容器镜像
  • Checkmarx 执行 SAST 分析
  • 生成 CycloneDX 格式 SBOM
  • 策略引擎评估风险等级
  • 自动化审批或拦截发布
PHP安全编码:is_numeric与strcmp函数漏洞剖析与修复实践 在PHP开发中,输入验证与数据比较是保障应用安全的基础环节。is_numeric()函数用于检测变量是否为数字,但其宽松的判定规则可能引发安全风险;strcmp()函数用于字符串比较,但对非字符串参数的处理行为存在不确定性。理解这些内置函数的行为边界与原理,对于构建可靠的安全防御体系至关重要。通过分析常见漏洞模式,如十六进制、科学计数法绕过以及数组参数导致的类型混淆,可以揭示弱类型语言中开发预期与实际行为的差异。在工程实践中,应采用ctype_digit()、filter_var()进行严格输入验证,使用h 阅读详情

相关推荐

16、PHP错误处理与安全编码全解析

本文详细解析了PHP中的错误处理机制与安全编码实践,涵盖文件系统路径与URL的区别、try/catch异常处理、用户输入验证、常见Web安全威胁(如XSS、CSRF、SQL注入)及其防御策略等内容。同时提供了代码示例与实际操作步骤,帮助开发者提升PHP应用的稳定性和安全性。

hp777的博客 71

PHP 7.1类常量可见性详解(public特性大揭秘):提升面向对象编程安全性的核心技巧

掌握PHP 7.1类常量可见性(public)提升代码安全性与封装性,详解如何在面向对象编程中合理使用public类常量,明确适用场景与设计优势,避免数据暴露风险,优化程序结构,值得收藏。

CodePulse的博客 660

PHP中->、=>与::操作符详解及实战用法

讲了这么多,回到最初的问题:->=>究竟教会了我们什么?->告诉我们,对象是活的。它有状态,有行为,有生命周期。善用它,就是善用面向对象的力量。=>告诉我们,数据是有结构的。良好的数据组织,能让代码自我解释,减少沟通成本。告诉我们,效率与简洁有时要牺牲一点纯粹性。关键在于权衡,在正确的地方用正确的工具。这些操作符,不仅仅是语法糖。它们是PHP语言设计理念的缩影,也是我们日常编码决策的指南针。所以,下次当你敲下->

weixin_42476987的博客 969

php安全编码规范

php安全编码规范是一套面向应用开发人员的安全参考手册。应用开发人员通过阅读文档,获取每一类安全漏洞产生的原因及防范方法,从而在程序开发过程中尽量避免安全问题的产生。通过安全编码规范的约束,使开发人员能够养成良好的编程习惯,减少系统安全漏洞的产生。

Jaskzon的博客 2004

PHP安全编码实践:识别与防范常见漏洞

在当今网络安全的战场上,Web应用无疑是一个主要的前沿阵地。特别是对于使用PHP语言构建的Web系统,其安全漏洞频发,给开发者和安全专家带来了巨大的挑战。本章将概述PHP中最常见的安全漏洞类型,并提出相应的安全编码原则,帮助开发者构建更为安全的应用。安全漏洞是指在软件设计、实现、配置或管理上的缺陷,这些缺陷可以被攻击者利用,以获取非法的系统访问权限或对系统进行未授权的操控。PHP作为一门广泛使用的服务器端脚本语言,因其易用性和灵活性,成为了Web开发的首选,但同时也成为黑客攻击的众矢之的。

weixin_42593549的博客 1094

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

PHP类设计中的隐藏风险:3分钟搞懂属性可见性与类型约束协同机制

掌握PHP 7.4 类型属性可见性协同机制,避免类设计隐患。详解public、protected、private与类型约束在实际开发中的配合使用,提升代码健壮性与可维护性,团队协作更高效,值得收藏。

FastCompile的博客 896

vietjetair 航空的webpack多参数生成学习

工作内不是特别多,居安思危,有一个抓机票信息的公司面试前竟然需要做面试题,这就是一个题。看了下,有点麻烦,webpack 最初不得要领,看了下资料,找了个框架,练了两个简单的,搞这个吧。入库需要自己找,有几个参数不是明文的,算法不是很复杂,位置不太好找。整体难度一般。

liu_yueyang的博客 1510

PHP Web安全实战:从漏洞攻防到渗透测试与安全编码-6

PHP安全编码实践与主动防御摘要 安全编码是PHP开发的基石,需贯穿数据处理的每个环节。核心原则包括:不信任用户输入(使用sanitizeInput()过滤)、严格验证格式(如validateEmail())、转义输出(escapeHTML()防XSS)、参数化查询(prepareSQLStatement()防SQL注入)。主动防御需预判攻击模式,通过detectSQLInjectionAttempt()和detectXSSAttempt()识别恶意输入。关键实践还涉及会话安全(secureSessionS

zwh821的博客 1308

Unity AR开发实战:从Vuforia图片识别到实体识别全流程解析

增强现实(AR)技术通过计算机视觉算法将虚拟信息叠加到现实世界,其核心原理在于对现实环境的感知与理解。在移动端AR开发中,图像识别与物体识别是实现虚实融合的关键技术,它们决定了虚拟内容能否准确、稳定地与现实对象对齐。Vuforia作为成熟的商业AR SDK,为开发者提供了从平面图像识别(Image Target)到三维实体识别(Model Target)的完整解决方案,极大降低了计算机视觉技术的应用门槛。在工程实践中,Vuforia通过封装复杂的特征提取与匹配算法,使开发者能够专注于交互设计与内容制作,广泛

weixin_30972263的博客 302

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 2997

《零基础学 PHP:从入门到实战》·模块十二:精通面向对象思想,用设计模式构建健壮应用-1

本教程深入讲解PHP高级面向对象编程和设计模式,帮助开发者构建更灵活、易维护的应用架构。主要内容包括:抽象类、接口、Trait等高级OOP工具的使用;单例、工厂等经典设计模式的实现;测试驱动开发(TDD)理念与PHPUnit基础;最后通过"简易订单处理系统"实战项目综合运用所学知识。学习后,开发者将能够设计松耦合、高内聚的代码结构,运用设计模式解决特定问题,并具备编写可测试代码的能力,为中大型项目开发奠定基础。

zwh821的博客 980

Verilog语法之十:过程块(initial和always)

我将Verilog的语法进行了总结,写了13篇文章,让小白“快速见识猪如何跑”,每一篇讲解一类语法,结合正确的示例代码和错误的示例代码,有的章节对个别语法进行了归纳总结,帮助初学者加深理解。

航天领域资深码农,型号经验丰富,一线干货分享 1672

PHP Web安全实战:从漏洞攻防到渗透测试与安全编码-7

摘要: 本章深入探讨PHP应用中的高级安全威胁与复杂漏洞,超越基础防护,揭示逻辑漏洞、业务层漏洞等隐蔽威胁。通过模拟函数演示SQL注入、XSS攻击等典型漏洞,强调参数化查询和输出转义的核心防御机制。重点分析二次注入、不安全的反序列化、服务器配置缺陷等高级风险,提出安全开发应贯穿设计编码全过程的理念。通过[safeQuery]、[escapeHtml]等安全函数示例,展示如何将用户输入与代码指令严格分离,构建多层次的防御体系。本章旨在培养开发者以攻击者思维识别潜在漏洞,用建设性方法加固每个环节的安全防护。

zwh821的博客 1168

【用unity实现100个游戏之19】制作一个3D传送门游戏,实现类似鬼打墙,迷宫,镜子,任意门效果(附项目源码)

本文介绍了Unity中实现传送门效果的完整流程。通过第一人称角色控制器实现移动,使用PortalView脚本和自定义Unlit Shader渲染门内场景,巧妙利用相机位置和旋转同步实现动态视角。重点解决了近裁剪面问题,确保远距离渲染正确性。最后通过PortalTeleporter脚本实现传送功能,检测碰撞并计算相对位置进行瞬移。该方法无需复杂插件,代码简洁高效,适用于各类3D场景中的传送门实现。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

YOLO蒸馏原理篇之---MGD、CWD蒸馏

本文详细介绍了特征蒸馏中的两种经典有效方法,MGD和CWD蒸馏

qq_41920323的博客 3241

PHP安全编码实践指南:从纵深防御到SQL注入与XSS防护

在实际 PHP 项目中,安全编码常常被简化为“过滤输入、转义输出”两句口号,但真正落地时会发现,从用户输入到数据库存储,再到前端渲染,任何一个环节的疏忽都可能导致注入、跨站脚本、信息泄露等严重漏洞。PHP 因其灵活性和历史原因,在安全编码实践上需要开发者投入更多精力,理解其底层机制和常见陷阱。 本文旨在为初中级 PHP 开发者提供一个系统性的安全编码视角。我们将从 PHP 安全的核心原则“纵深防御”出发,逐步深入到输入验证、输出转义、数据库操作、会话管理、文件处理、配置安全等具体环节,并结合代码示例和常见错

weixin_33646989的博客 274

YOLOv12改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1779

华为java安全编码规范_构建企业级研发安全编码规范

本文主要介绍如何构建一套基于安全基础库所制定的安全编码规范以及如何在DevSecOps中进行落地,从而在日常研发中增强业务整体的安全性。1为什么需要安全编码规范+安全基础库?从当前公开的漏洞来看,大部分安全漏洞很多程度上是由于代码编写风格较为随意、编程语言特性理解不当、相关API使用不当造成的,特别是动态脚本语言,如PHP,如果不了解其中的某些特性,很容易写出安全漏洞。为了解决这类问题,...

weixin_39524959的博客 1136

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

PHP安全 [安全编码]

总则: 绝对安全的系统是不存在的。最好的安全机制应该能在不防碍用户,并且不过多地增加开发难度的情况下做到能满足需求。 木桶原理,一个系统的的强度是由它最薄弱的环节决定的。 安全编码细则: 所有输入的数据都是有害的(直接或者间接由用户输入的) 不依赖运行环境的安全配置 安全控制措施落实在最后执行阶段 最小化 失败终止 文件系统安全 源码: <?php //从用户目录中删除指定的文件 $username = $_POST['user_submitted_name']; $us.

weixin_45253622的博客 7931

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PHP安全编码规范与最佳实践

安全编码的几个原则。echo "欢迎," . htmlspecialchars($name, ENT_QUOTES, 'UTF-8');in_array($mime, $allowedMimes)) die("不允许的文件类型");in_array($ext, $allowedExts)) die("不允许的扩展名");php // 不要用md5或sha1。php // php.ini配置。php // 正确:预处理语句。php // HTML上下文。

raoxiaoz0425的博客 53

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

HTTP-Message安全编码:7个输入验证与输出编码最佳实践

在现代Web开发中,HTTP消息处理是构建安全应用程序的基石。http-message作为PSR-7标准的实现,为PHP开发者提供了处理HTTP请求和响应的统一接口。本文将深入探讨如何在使用http-message时实施有效的安全编码实践,确保应用程序免受常见安全威胁。 ## 🔒 为什么HTTP消息安全如此重要? HTTP消息安全编码不仅仅是技术需求,更是保护用户数据和应用程序完整性的关键防

gitblog_00629的博客 382

【安全开发】PHP安全编码规范

申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%84%E8%8C%83%E6%96%87%E6%A1%A3/2018-08-17-SDL-2-php%E5%AE%89%E5%85%A8%E7%BC%96%E7%A0%81%E8%A7%84%...

584

探索Rhizobia_P:PHP安全编码的终极解决方案

探索Rhizobia_P:PHP安全编码的终极解决方案 在当今的数字时代,安全性已成为软件开发中不可或缺的一部分。随着网络攻击日益增多,开发人员需要确保他们的应用程序不仅功能强大,而且安全可靠。今天,我们将介绍一个强大的开源项目——Rhizobia_P,它为PHP开发者提供了一套全面的安全编码规范和SDK,帮助构建更加安全的应用程序。 项目介绍 Rhizobia_P项目由Momosecurity团...

gitblog_01056的博客 387

【医疗数据合规报告生成秘籍】:PHP开发者必须掌握的10大安全编码实践

掌握医疗数据PHP的合规报告生成关键方法,保障系统安全与法律合规。本文详解10大安全编码实践,涵盖数据加密、权限控制、审计日志等核心场景,提升代码安全性与可维护性。PHP开发者必备指南,值得收藏。

VarPerch的博客 809
上一篇: json_decode深度限制踩坑实录,你真的了解max_depth吗?
下一篇: ggplot2中position_dodge.width到底怎么设?误差线对齐问题一文搞定
PixelIsle
博客等级 码龄1年 148粉丝 1971原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值