diff --git a/PhpCollective/Sniffs/Operators/OperatorSpacingSniff.php b/PhpCollective/Sniffs/Operators/OperatorSpacingSniff.php
new file mode 100644
index 0000000..071ff70
--- /dev/null
+++ b/PhpCollective/Sniffs/Operators/OperatorSpacingSniff.php
@@ -0,0 +1,34 @@
+getTokens();
+ $before = $phpcsFile->findPrevious(Tokens::$emptyTokens, $stackPtr - 1, null, true);
+ $after = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true);
+
+ if ($before === false || $after === false) {
+ return;
+ }
+
+ $newline = $tokens[$before]['line'] !== $tokens[$stackPtr]['line']
+ || $tokens[$after]['line'] !== $tokens[$stackPtr]['line'];
+ $spacing = false;
+ for ($i = $before + 1; $i < $after; $i++) {
+ if ($tokens[$i]['code'] === T_WHITESPACE) {
+ $spacing = true;
+
+ break;
+ }
+ }
+ if (!$newline && !$spacing) {
+ return;
+ }
+
+ $message = 'Expected no whitespace around the catch type separator';
+ if ($newline) {
+ $phpcsFile->addError($message, $stackPtr, 'SpacesAround');
+
+ return;
+ }
+
+ $fix = $phpcsFile->addFixableError($message, $stackPtr, 'SpacesAround');
+ if ($fix) {
+ $phpcsFile->fixer->beginChangeset();
+ for ($i = $before + 1; $i < $after; $i++) {
+ if ($i !== $stackPtr && $tokens[$i]['code'] === T_WHITESPACE) {
+ $phpcsFile->fixer->replaceToken($i, '');
+ }
+ }
+ $phpcsFile->fixer->endChangeset();
+ }
+ }
+
+ public static function isCatchTypeSeparator(File $phpcsFile, int $stackPtr): bool
+ {
+ $tokens = $phpcsFile->getTokens();
+ if ($tokens[$stackPtr]['code'] !== T_BITWISE_OR || empty($tokens[$stackPtr]['nested_parenthesis'])) {
+ return false;
+ }
+
+ $openers = array_keys($tokens[$stackPtr]['nested_parenthesis']);
+ $opener = end($openers);
+
+ return isset($tokens[$opener]['parenthesis_owner'])
+ && $tokens[$tokens[$opener]['parenthesis_owner']]['code'] === T_CATCH;
+ }
+}
diff --git a/PhpCollective/ruleset.xml b/PhpCollective/ruleset.xml
index e5a84ee..fa271fd 100644
--- a/PhpCollective/ruleset.xml
+++ b/PhpCollective/ruleset.xml
@@ -237,6 +237,7 @@
+